Considere o seguinte:
CREATE PROCEDURE dbo.usp_trantest AS
SELECT @@TRANCOUNT as trancount;
GO
Quando eu chamo usp_trantest
manualmente de dentro do SSMS, o trancount é 0. Se eu executar um relatório do SSRS que contém um conjunto de dados que consulta o mesmo procedimento armazenado, o trancount é registrado como 1.
Fazer um rastreamento T-SQL do método SSRS mostra um evento de rastreamento para a chamada do procedimento armazenado que é idêntico ao que fiz do SSMS.
Existe algum comportamento que pode mudar com base no contexto do SSRS? Tipo, uma transação implícita sendo aberta para a chamada sql dinâmica ou algo assim, ou SSRS criando um contexto de transação fora do T-SQL?
Editar:
Em uma resposta agora excluída de alguém (obrigado, estranho!), Foi sugerido que o conjunto de dados do relatório SSRS pode ter marcado "Usar transação única ao processar as consultas". Este foi realmente o caso!
Fiz mais alguns testes e, com essa configuração desmarcada, @@TRANCOUNT
é a mesma execução no SSMS ou em um relatório do SSRS.
Portanto, podemos concluir que essa configuração da fonte de dados faz com que o relatório do SSRS crie um contexto de transação no banco de dados antes de executar as consultas. Como essa transação extra não aparece no rastreamento T-SQL, provavelmente podemos assumir que ela está sendo aberta usando um método API, em vez de uma instrução T-SQL.
Na fonte de dados de um relatório do SSRS, há uma propriedade para "Usar transação única ao processar as consultas". Existem alguns comportamentos diferentes vinculados à marcação dessa caixa de seleção:
1) Como você notou, o SSRS usará uma transação explícita para processar os conjuntos de dados usando esta fonte de dados, se esta caixa de seleção estiver marcada. Quando não está marcado , não há transação explícita.
2) Quando esta caixa de seleção não estiver marcada, os conjuntos de dados que usam a fonte de dados serão executados em paralelo, usando conexões separadas com o servidor. Se a caixa de seleção estiver marcada, os conjuntos de dados usam uma única conexão e são processados em série.
Além disso, pode haver diferentes motivações para usar esta caixa de seleção. Os dois principais são:
1) Consistência de leitura : se você estiver usando o Snapshot Isolation , talvez queira que todos os conjuntos de dados sejam consistentes em um único ponto no tempo. Nesse caso, usar uma única transação explícita e usar o nível de isolamento Snapshot pode garantir que todas as instruções dentro da transação sejam consistentes em um único ponto no tempo.
2) Desempenho : dependendo de vários fatores (que são realmente um tópico separado), você pode ver uma diferença dramática de desempenho entre executar as consultas para diferentes conjuntos de dados em paralelo e executá-los em série.
No SSRS 2012, não encontrei o mesmo comportamento indicado aqui. Meus SPs foram executados dentro das transações, apesar de não ter a caixa marcada.
Marcar a caixa não teve efeito na contagem de transações. Em ambos os casos, @@TRANCOUNT foi = 1.