Existe um pacote SSIS com Required
transação no nível do pacote e Supported
no nível das tarefas. A parte principal do pacote é excluir os dados e inserir novos dados:
Aqui, o bloco Delete exclui tudo de seis tabelas e o bloco Parse carrega seis arquivos nas seis tabelas.
Se o Delete usar delete from dbo.table
, tudo funcionará bem, mas será lento.
Mas se Delete usar truncate table dbo.table
em vez disso, a exclusão não leva tempo, mas o pacote fica bloqueado quando se trata da Parse
tarefa. Ficaria sentado sem fazer nada.
Neste momento, no lado do servidor, posso ver um spid SSIS sendo bloqueado por spid -2
, que é "transação distribuída órfã". Parece que usado para representar a conexão truncada. Essa conexão paira e o pacote é bloqueado pelas travas que ele colocou.
Se eu alternar o único gerenciador de conexão do SQL Server usado para RetainSameConnection = True
, o pacote falhará assim que entrar na tarefa de análise . A tarefa solicita uma conexão ao gerente e o gerente responde com
[Destino do SQL Server [471]] Erro: Código de erro SSIS DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER. A chamada do método AcquireConnection para o gerenciador de conexões "Connection Manager" falhou com o código de erro 0xC001A004. Pode haver mensagens de erro postadas antes disso com mais informações sobre o motivo da falha na chamada do método AcquireConnection.
Existe uma maneira de configurar o pacote para que ele use truncate
e não se bloqueie?
Isso ocorre devido ao bloqueio causado pela
delete
tarefa de acessar os metadados do banco de dados durante a fase de Pré-Execução.Os bloqueios podem ser encontrados usando
sys.dm_tran_locks
e terão-2
valor como OP fundado. Mais detalhes poderiam ter sido descobertos usando o Profiler.O bloqueio pode ser resolvido alterando a
ValidateExternalMetadata
propriedade paraFALSE
ou como OP mencionado usando umaDELETE
instrução.Referência: KB2253391