Executei a seguinte consulta no SQL Server 2012:
create table testTransaction
(
id int
name varchar(100)
)
insert into testTransaction values (1,'ABC'),(2,'XYZ')
/* Query1 */
begin try
begin transaction
insert into testTransaction values (3,'FGH')
commit transaction
end try
begin catch
if @@trancount > 0
rollback transaction
end catch
Executei query1 e recebi um erro de que a conta que eu estava usando não tinha permissão para inserir valores nessa tabela. Em outra janela, tentei fazer um select em testTransaction mas a consulta continuou indefinidamente.
Foi então que percebi que a consulta anterior que executei na outra janela tinha uma transação aberta. Eu fui e rolei de volta e tudo funcionou bem.
O que teria acontecido se eu tivesse fechado a janela que tinha a transação aberta sem revertê-la? A transação estaria aberta até que alguém a revertesse manualmente ou o servidor SQL reverte quaisquer transações não confirmadas quando uma janela é fechada?
Além disso, como descubro todas as transações abertas em um banco de dados em qualquer sessão?
Supondo que quando você diz " janela de sessão " está se referindo a uma janela de consulta no SSMS. No SSMS, cada janela de consulta geralmente é sua própria conexão. Quando você fecha a janela, teoricamente fecha a conexão. (Teoricamente porque depende se a conexão é usada no pool de conexões ou não.)
Quando a conexão entre o cliente e o SQL Server é interrompida no meio de uma transação aberta, essa transação será revertida automaticamente. Isso é observado na resposta de Hannah em Quais são todas as maneiras pelas quais uma transação aberta será revertida? : " Desconexão pelo cliente, ou servidor, ou qualquer parte da infraestrutura entre ".
Respondendo suas perguntas
Na premissa de que a maioria dos RDBMS funciona com base no princípio ACID, sua transação seria revertida.
( ênfase minha)
Referência: ACID (Wikipédia)
Fechar uma janela deve resultar na reversão da transação para garantir as propriedades ACID das transações do banco de dados.
Fechando a janela de consulta no SSMS (caso real)
No SSMS, você é apresentado a uma caixa de diálogo que permite decidir como reagir ao fechar uma janela:
Fechamento forçado do SSMS via Taskmanager (caso real)
Quando o SSMS é encerrado por meio do Gerenciador de tarefas e/ou fechado à força, a transação é revertida automaticamente.
Isso pode ser reproduzido com os seguintes passos:
Crie a seguinte tabela em um banco de dados
Abra um SSMS e execute o seguinte script:
Abra um segundo SSMS e execute o seguinte script:
Mate o primeiro SSMS via Gerenciador de Tarefas.
Verifique se o segundo script da etapa 3. não exibe nenhum dado.
... e como mencionado por JD em sua resposta vinculada.
A transação seria revertida em circunstâncias normais.
Para determinar as transações atualmente abertas, você pode consultar o
sys.dm_exec_sessions
,sys.dm_exec_connections
esys.dm_exec_reuqests
outras exibições de gerenciamento do sistema para determinar quaisquer transações abertas em uma solicitação ou em uma sessão.Roteiro de exemplo:
As colunas
Session_Open_Tranactions
eRequest_Open_Transaction
mostrariam as transações ainda em execução para qualquer dadoSession_ID
.