Réponses:
Tant que vous ne COMMITEZ pas ou ne ROLLBACK une transaction, elle est toujours «en cours» et potentiellement verrouillée.
Si votre client (application ou utilisateur) ferme la connexion à la base de données avant de valider, toutes les transactions en cours d'exécution seront annulées et arrêtées.
Vous pouvez en fait essayer 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.
Vous pouvez maintenant commencer une transaction dans une fenêtre, faire des choses comme insérer / mettre à jour / supprimer, mais pas encore valider. puis 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'isolement, la table peut être verrouillée jusqu'à ce que la première fenêtre soit validée, 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 sans indice de verrouillage pour voir comment ils affectent les résultats.
Voir également ce qui se passe lorsque vous lancez une erreur dans la transaction.
Il est très important de comprendre comment tout cela fonctionne ou vous serez déconcerté par ce que fait sql, plusieurs fois.
S'amuser! GJ.
Les transactions sont destinées à s'exécuter complètement ou pas du tout. La seule façon de terminer une transaction est de valider, toute autre méthode entraînera une annulation.
Par conséquent, si vous commencez et que vous ne vous engagez pas, il sera annulé à la fermeture de la connexion (car la transaction a été interrompue sans être marquée comme terminée).
dépend du niveau d'isolement de la transaction entrante.
Lorsque vous ouvrez une transaction, rien n'est verrouillé par lui-même. Mais si vous exécutez certaines requêtes à l'intérieur de cette transaction, en fonction du niveau d'isolement, certaines lignes, tables ou pages sont verrouillées, ce qui affectera d'autres requêtes qui tentent d'y accéder à partir d'autres transactions.
Exemple de transaction
commencer tran tt
Vos instructions SQL
si une erreur s'est produite, rollback tran tt else commit tran tt
Tant que vous n’avez pas exécuté la validation de validation, les données ne seront pas modifiées
BEGIN TRAN X ... BEGIN TRAN Y ... ROLLBACK Y
ne fonctionne pas, par exemple. Voir stackoverflow.com/questions/1273376/…
En plus des problèmes de verrouillage potentiels que vous pourriez causer, vous constaterez également que vos journaux de transactions commencent à augmenter car ils ne peuvent pas être tronqués au-delà du LSN minimum pour une transaction active et si vous utilisez l'isolement de snapshot, votre magasin de versions dans tempdb augmentera pendant raisons similaires.
Vous pouvez utiliser dbcc opentran
pour voir les détails de la transaction ouverte la plus ancienne.
Toute transaction non effectué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.
Le comportement n'est pas défini, vous devez donc définir explicitement un commit ou un rollback:
http://docs.oracle.com/cd/B10500_01/java.920/a96654/basic.htm#1003303
"Si le mode de validation automatique est désactivé et que vous fermez la connexion sans valider ou annuler explicitement vos dernières modifications, une opération COMMIT implicite est exécutée."
Hsqldb effectue une restauration
con.setAutoCommit(false);
stmt.executeUpdate("insert into USER values ('" + insertedUserId + "','Anton','Alaf')");
con.close();
le résultat est
2011-11-14 14: 20: 22,519 INFO principal [SqlAutoCommitExample: 55] [AutoCommit enabled = false] 2011-11-14 14: 20: 22 546 INFO principal [SqlAutoCommitExample: 65] [Trouvé 0 # utilisateurs dans la base de données]