web-dev-qa-db-fra.com

Que se passe-t-il si vous ne validez pas une transaction dans une base de données (par exemple, SQL Server)?

Supposons que j'ai une requête:

begin tran
-- some other sql code

Et puis j'oublie de commettre ou de revenir en arrière.

Si un autre client tente d'exécuter une requête, que se passera-t-il?

95
Charbel

Tant que vous ne faites pas COMMETTRE ou ANNULER une transaction, c'est toujours " en cours d'exécution "et potentiellement tenir des verrous.

Si votre client (application ou utilisateur) ferme la connexion à la base de données avant la validation, toutes les transactions en cours d'exécution seront annulées et terminées.

129
marc_s

Vous pouvez réellement essayer cela vous-même, cela devrait vous aider à comprendre comment cela fonctionne.

Ouvrez deux fenêtres (onglets) dans le studio de gestion, chacune d’elles aura sa propre connexion à SQL.

Maintenant, vous pouvez commencer une transaction dans une fenêtre, faire des choses comme insérer/mettre à jour/supprimer, mais pas encore valider. ensuite, dans l'autre fenêtre, vous pouvez voir à quoi ressemble la base de données de l'extérieur de la transaction. En fonction du niveau d'isolation, la table peut être verrouillée jusqu'à la validation de la première fenêtre ou vous pouvez (ne pas) voir ce que l'autre transaction a fait jusqu'à présent, etc.

Jouez avec les différents niveaux d'isolation et aucun indice de verrouillage pour voir comment ils affectent les résultats.

Voyez également ce qui se passe lorsque vous générez une erreur dans la transaction.

Il est très important de comprendre comment tout cela fonctionne, sinon vous serez surpris par ce que fait SQL, maintes fois.

S'amuser! GJ.

33
gjvdkamp

Les transactions sont destinées à être exécutées complètement ou pas du tout. La seule façon de terminer une transaction est de valider, toute autre manière entraînera une annulation.

Par conséquent, si vous commencez et que vous ne vous engagez pas, la transaction sera annulée à la fermeture de la connexion (la transaction ayant été interrompue sans être marquée comme étant terminée).

14
Piskvor

dépend du niveau d'isolement de la transaction entrante.

Explication de l'isolation de transaction SQL

3
Xhalent

Lorsque vous ouvrez une transaction, rien n'est verrouillé par lui-même. Toutefois, si vous exécutez des requêtes dans cette transaction, certaines lignes, tables ou pages sont verrouillées en fonction du niveau d'isolation, ce qui affectera les autres requêtes qui tentent d'y accéder à partir d'autres transactions.

2
red.clover

Exemple pour une transaction

commencer tran tt

Vos déclarations SQL

si une erreur survient, vous effectuez un retour en arrière.

Tant que vous n'avez pas exécuté la commande commit, les données ne seront pas modifiées

1
user3386471

En plus des problèmes de verrouillage potentiels que vous pourriez causer, vous constaterez également que vos journaux de transactions commencent à se développer car ils ne peuvent pas être tronqués au-delà du nombre minimal de LSN pour une transaction active. Si vous utilisez l'isolation de capture instantanée, votre magasin de versions dans tempdb augmentera des raisons similaires.

Vous pouvez utiliser dbcc opentran pour voir les détails de la transaction ouverte la plus ancienne.

0
Martin Smith

Toute transaction non validée laissera le serveur verrouillé et les autres requêtes ne s'exécuteront pas sur le serveur. Vous devez soit annuler la transaction, soit la valider. La fermeture de SSMS mettra également fin à la transaction, ce qui permettra à d'autres requêtes de s'exécuter.

0
Josh Stunner