2017-07-13 1 views
0

J'essaie d'exec à propos de la requête suivante (voir ci-dessous) avec le ManagentStudio. Le temps d'exécution de la requête commence à prendre du temps, j'appuie sur le bouton StopExecution au carré rouge qui se trouve en haut de la fenêtre ManStd, la requête cesse d'être traitée et ses résultats sont annulés. Ensuite, j'émets une instruction 'select @@ trancount' et montre qu'il y a une transaction ouverte. Depuis que j'ai frappé StopExecution, la transaction devait être annulée, n'est-ce pas? Pourquoi est-ce que je reçois le message disant qu'il y a une transaction ouverte et pourquoi sp_lock me montre-t-il qu'il y a un tas de RID de MyTable sous X lock? Toutes les actions sont effectuées sur SQL Server 2008 (RTM)Un tran annulé dans MngStd existe toujours

Declare @i Integer = 1; 
Begin transaction 
    While @i <= 100000 
    Begin 
     Insert into MyTable 
     Values(default); 
     Set i+=1; 
    End 
Commit transaction 

Répondre

2

L'annulation d'une requête n'annule pas la transaction par défaut. Lorsque vous appuyez sur le bouton Annuler dans SSMS ou qu'un délai d'attente se produit pendant l'exécution, l'application ou l'API client envoie une demande d'attention pour demander à SQL Server d'arrêter l'exécution du lot en cours. La transaction restera active par défaut.

Vous pouvez spécifier SET XACT_ABORT ON pour que l'événement d'attention annule également la transaction. Ceci est configurable dans SSMS (Query -> Query Options - Advanced). Un SET XACT_ABORT ON explicite et devrait être inclus dans tous les procs stockés avec BEGIN TRAN aussi pour éviter des problèmes après un délai de requête.

SET XACT_ABORT ON; 
DECLARE @i Integer = 1; 
BEGIN TRANSACTION; 
    WHILE @i <= 100000 
    BEGIN 
     INSERT INTO dbo.MyTable 
     VALUES(default); 
     SET i+=1; 
    END 
COMMIT; 
+0

Merci beaucoup, Dan! – Romano