Usando o SQL Server Management Studio, abra uma janela de consulta e execute
BEGIN TRAN
Em outra janela execute
select [text],
from sys.sysprocesses
cross apply sys.dm_exec_sql_text(sql_handle)
where status = 'sleeping'
and open_tran = 1
Eu vejoselect @@trancount
O que há com isso? Quem está contando as transações? Isso é coisa do Management Studio?
Isso é coisa do SQL Server Management Studio. Pelo menos SSMS versão 13.0.15500.91. Esta versão do SSMS contará o número de transações abertas em seu nome usando a mesma conexão de sua janela de consulta.
Aqui está como eu descobri,
SELECT @@TRANCOUNT
BEGIN TRAN
SELECT @@TRANCOUNT
após cada execução.SELECT SERVERPROPERTY('EngineEdition') AS DatabaseEngineEdition
antes de cada execução.BEGIN TRAN
acaba por ser um pouco de um arenque vermelho. O SSMS 2016 executa essas consultas extras, não importa o que seja executado na janela de consulta... mesmo que seu lote seja apenas um espaço em branco.Não acho que seja uma coisa do Management Studio - já vi isso com outro aplicativo antes, mas não o vi pessoalmente com o SSMS. Dito isso, não ficaria surpreso se o SSMS fizesse algo assim em algum cenário.
Se você pegar mais algumas colunas de sys.sysprocesses, poderá rastrear quem está contando as transações - em particular, se for a janela de consulta do SSMS (ou seja, algo que você fez) ou o SSMS fazendo suas próprias coisas :
A
BEGIN TRAN
instrução incrementa os contadores@@trancount
eopen_tran
- mas até que você faça "coisas", ela não mantém nenhum bloqueio, causa qualquer bloqueio ou impede a reutilização do log de transações. Por causa disso, parei de usar a coluna open_tran como motivo de preocupação. Em vez disso, vejo o estado específico da transação emsys.dm_database_transactions
:Você pode usar as
database_transaction_state
colunas e outras para obter informações mais úteis para decidir se precisa se preocupar com isso.[EDIT] : Parece que isso é algo novo no SSMS 2016: se eu usar o SSMS 2014, não estou vendo o comportamento que você descreveu, mas quando uso o SSMS 2016, vejo exatamente esse comportamento. Parece que o SSMS 2016 faz
select @@trancount
implicitamente depois de executarBEGIN TRAN
ou qualquer consulta em uma janela de consulta. O Profiler/Extended Events confirma que há um Batch Started/Concluído para oBEGIN TRAN
ou qualquer outro, seguido imediatamente por um segundo Batch Started/Completed para oselect @@trancount
. Esquisito.@@trancount
é por sessão, portanto, você veria um valor de 1 se o executasse naBEGIN TRAN
janela.Você está vendo uma
sleeping
entrada para a primeira sessão porque ela não está realmente fazendo nada. A transação está aberta, mas nenhum trabalho está sendo feito. Seria a mesma coisa se você abrisse uma transação, fizesse um monte de trabalho (que terminou), mas nunca fechasse a transação.Ok, acho que entendi sua pergunta um pouco melhor agora. Eu vi um
BEGIN TRAN
na primeira vez que executei sua consulta, então tentei executarSELECT @@trancount
na primeira sessão. Quando voltei para a segunda sessão, vi oSELECT @@trancount
que você fez.Ele vai mostrar a você a última coisa que foi executada naquela primeira sessão.