Que se passe-t-il si vous ne validez pas une transaction dans une firebase database (par exemple, SQL Server)?

Supposons que j’aie 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 passerait-il?

Tant que vous ne vous engagez pas ou que vous ne faites pas de ROLLBACK une transaction, elle est toujours en cours d’exécution et peut contenir des verrous.

Si votre client (application ou utilisateur) ferme la connexion à la firebase database, toutes les transactions en cours d’exécution seront annulées et terminées.

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

Ouvrez deux fenêtres (tabs) en 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 firebase database en dehors de la transaction. Selon le niveau d’isolation, la table peut être verrouillée jusqu’à ce que la première fenêtre soit validée ou vous pouvez (pas) voir ce que l’autre transaction a déjà fait, etc.

Jouez avec les différents niveaux d’isolement et aucun indice de locking pour voir comment ils affectent les résultats.

Voyez é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 surpris par ce que fait SQL, souvent.

S’amuser! GJ.

Les transactions sont destinées à fonctionner complètement ou pas du tout. Le seul moyen d’effectuer une transaction est de valider, toute autre méthode entraînera une annulation.

Par conséquent, si vous commencez puis ne commettez pas, il sera annulé à la fermeture de la connexion (car la transaction a été rompue sans marquage comme étant terminé).

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

L’isolement des transactions SQL expliqué

Lorsque vous ouvrez une transaction, rien ne se verrouille tout seul. Mais si vous exécutez certaines requêtes au sein de cette transaction, selon le niveau d’isolation, certaines lignes, tables ou pages sont verrouillées, ce qui affecte d’autres requêtes qui tentent d’y accéder depuis d’autres transactions.

Exemple de transaction

commencer tran tt

Vos déclarations SQL

si une erreur est survenue rollback trt tt sinon commit trt tt

Tant que vous n’avez pas exécuté le transfert, les données ne seront pas modifiées

Outre les problèmes de locking potentiels que vous pourriez rencontrer, vous constaterez également que vos journaux de transactions commencent à se développer 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 des raisons similaires.

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

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 aux autres requêtes d’exécuter.

Le comportement n’est pas défini, vous devez donc définir explicitement une validation ou une restauration:

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 implicite de COMMIT est exécutée.”

Hsqldb fait un retour en arrière

 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 main INFO [SqlAutoCommitExample: 55] [AutoCommit enabled = false] 2011-11-14 14: 20: 22,546 main INFO [SqlAutoCommitExample: 65] [0 # utilisateurs trouvés dans la firebase database]