2010-08-04 4 views
1

je l'ai fait un test simple pour comprendre comment les transactions fonctionnent en .netComment transactions .NET fonctionnent sur la base de données Sql Server Lorsque effectué une petite analyse

Exemple de code sur lequel mon test de transaction a été faite est

_sqlHelper = new SqlHelper(true); 
try 
{ 
    _sqlHelper.ExecuteNonQuery(SpName.sp_UpdateRoomStatus.ToString() 
     , Parameters.SqlParam<int?>("DepartmentId", this.DepartmentId, SqlDbType.Int) 
     ); 

    _sqlHelper.ExecuteNonQuery(SpName.sp_UpdateRoomStatus.ToString() 
     , Parameters.SqlParam<int?>("DepartmentId", this.DepartmentId, SqlDbType.Int) 
     ); 

    _sqlHelper.CommitTransaction(); 
} 
catch (SqlHelperException ex) 
{ 
    _sqlHelper.RollBackTransaction(); 
} 

description sur le test

Quand j'écrit de nouveaux SqlHelper (true); une nouvelle transaction démarre en interne et la connexion a été créée et ouverte à la base de données. Maintenant, la fonction ci-dessus exécute ma procédure et effectue les modifications dans une base de données.

J'ai écrit deux fois le même appel de fonction pour exécuter la procédure deux fois. Cette procédure fait l'insertion dans la base de données. Cette procédure contient 3 requêtes d'insertion dans 3 tables différentes. Maintenant, j'ai marqué le point d'arrêt sur les deux appels de fonction.

Dès que le contrôle arrive sur le premier point de rupture, je laisse simplement son traitement faire, ce qui signifie que la première procédure a été effectuée.

Maintenant, j'ai débranché mon fil LAN puisque la DB était sur le système distant. Ce qui signifie que la connexion est perdue. D'où la transaction à être rollback.

Maintenant, lorsque j'ai vérifié la base de données une fois le processus terminé. J'ai trouvé que les données étaient dans un état cohérent, ce qui prouve que la transaction fonctionne.

Je suis confus à ce moment là où une insertion réelle a eu lieu à partir du 1er appel de procédure, puisque la procédure a été exécutée avec succès. Comment le serveur sql a-t-il été informé que la transaction était en cours et que la restauration devait avoir lieu?

Il semble que la connexion à la base de données ait été établie en notifiant que la connexion contient une transaction et qu'elle devrait être annulée si la connexion est perdue.

Par conséquent, indiquant également que les modifications effectuées sont conservées dans la base de données plutôt que dans l'environnement .net.

Répondre

1

La base de données sait que la connexion et les modifications doivent être dans une transaction - les modifications réelles et les données d'origine sont stockées dans le journal des transactions de la base de données. Lorsque la transaction n'est pas correctement validée et que la connexion est perdue, la base de données annule automatiquement la transaction.

Fondamentalement, dans SqlTransactions (non distribué) .Net ne fait rien d'intelligent, tout est géré par la base de données.

+0

Mais comment une base de données sait-elle que plus de requêtes sont encore dans une file d'attente à exécuter. Et toutes les requêtes sont atomiques. Une connexion à la base de données est-elle toujours considérée comme une transaction unique? –

+0

Il ne sait pas qu'il n'y en a plus, il sait juste que la commande COMMIT n'a pas été appelée, donc tout ce qui existe depuis le début de la transaction doit être annulé. – cjk

+0

Mais qui appelle Commit Command. Personne n'a notifié la base de données lorsque la transaction a commencé et quand elle a été validée, sauf si nous spécifions Transaction explicitement chaque requête est considérée comme une transaction individuelle. Ainsi, la base de données a appris que le lot complet doit être considéré comme une seule transaction. Par conséquent, appelez commit –

Questions connexes