Est-ce que l'arrêt de la requête avec une restauration garantit une restauration?

Dites que j'ai une requête comme celle-ci:

BEGIN Transaction UPDATE Person SET Field=1 Rollback 

Il y a cent millions de personnes. J'ai arrêté la requête après vingt minutes. SQL Server restaurera-t-il les loggings mis à jour?

Une seule mise à jour ne mettra pas à jour certaines lignes. Il mettra à jour tout ou 0.

Donc, si vous annulez la requête, rien ne sera mis à jour.

Ce sont les systèmes de bases de données d'atomicité que SQL Server suit.

En d'autres termes, vous n'avez pas à faire cette restauration à la fin, rien n'a été commis de toute façon.

Lorsque vous annulez une requête, elle rest bloquée jusqu'à ce que tout soit annulé, donc pas besoin de paniquer.

Vous pouvez le tester vous-même, exécuter la requête longue, l'annuler et vous remarquerez qu'il faut un certain time avant que le process ne se termine vraiment.

Tant que l'instruction de update ne sera pas terminée, la transaction sera toujours ouverte. Veillez donc à revenir manuellement ou à fermer la window pour arrêter la transaction. Vous pouvez tester cela en incluant deux instructions dans votre transaction, où la première finit et vous annulez pendant qu'elle exécute la seconde – vous pouvez toujours valider la transaction après l'avoir arrêtée, puis get la première moitié de vos résultats.

 BEGIN Transaction UPDATE Person SET Field=1 WHERE Id = 1 UPDATE Person SET Field=1 Rollback 

Si vous démarrez cela, donnez-lui le time de terminer la première ligne, click le button Stop dans SSMS, puis exécutez la commit transaction , vous verrez que la première modification a été appliquée. Puisque vous ne voulez évidemment pas qu'une partie d'une transaction réussisse, je tuerais toute la window après que vous l'ayez arrêtée pour que vous soyez sûr que tout soit annulé.

Puisque vous avez ouvert la transaction, Arrêter manuellement la requête ne termine pas la transaction. Cette transaction sera toujours ouverte et toutes les requests suivantes à cette table seront bloquées.

Vous pouvez faire l'une des options suivantes

  1. Tuez la connection à l'aide de la command KILL SPID (SPID est l'identifiant de votre connection) Note: Cela annulera automatiquement les modifications que vous avez effectuées, vous pouvez surveiller l'état de restauration avec la command KILL SPID WITH STATUSONLY (After killing)
  2. Exécutez la command ROLLBACK manuellement

** SPID est votre ID de request, vous pouvez le find à partir de la table sys.sysprocesses / vous pouvez également le find sur la requête de gestion Studio Fenêtre le numéro qui est entre parenthèses / aussi vous pouvez le find en bas à droite de votre studio de gestion à côté du identifiant.

Exemple SQLQuery2.sql … (161) – 161 est votre spid.