Question

Je question similaire à comment Vérifier si vous êtes dans une transaction. Au lieu de vérifier, comment puis-je autoriser les transactions imbriquées?

J'utilise la base de données Microsoft SQL Server avec ADO.NET. Je l'ai vu des exemples en utilisant T-SQL et des exemples à partir des transactions en utilisant commencent et utilisant des noms de transaction. Lors de l'appel connection.BeginTransaction, j'appelle une autre fonction dans la même connexion, et il appelle à nouveau BeginTransaction qui me donne l'exception:

SqlConnection does not support parallel transactions.

Il semble beaucoup Microsoft variantes permettent, mais je ne peux pas comprendre comment le faire avec mon fichier .mdf.

Comment puis-je autoriser les transactions imbriquées avec une base de données Microsoft SQL Server en utilisant C # et ADO.NET?

Était-ce utile?

La solution

SQL Server dans son ensemble ne prend pas en charge les transactions imbriquées. Dans T-SQL, vous pouvez émettre un BEGIN TRAN l'intérieur d'un BEGIN TRAN plus tôt, mais cela est juste pour la commodité. Il est seulement la transaction extérieure qui compte. Le client .NET pour SQL Server (SqlConnection) ne vous permettent même de le faire et jette cette exception lorsque vous essayez.

Autres conseils

Il est une idée fausse que SQL Server prend en charge les transactions imbriquées. Ce ne est pas. l'ouverture de plusieurs transactions et d'appeler ensuite commettre ne fait absolument rien. vous pouvez facilement écrire quelques SQL test pour essayer vous-même. La seule option ici pour émuler une transaction imbriquée est d'utiliser Savepoints.

Je dois ajouter que la seule chose qui importe est quand @@ atteint TRAN_COUNT zéro est le point où la seule opération extérieure sera engagée.

SqlConnection conn = new SqlConnection(@"Data Source=test;Initial Catalog=test;User ID=usr;Password=pass");
conn.Open();
var com = conn.CreateCommand();

com.CommandText = "BEGIN TRANSACTION";
com.ExecuteNonQuery();
com.CommandText = "BEGIN TRANSACTION";
com.ExecuteNonQuery();
com.CommandText = "INSERT INTO testTable (ParamName,ParamValue) values ('test','test');";
com.ExecuteNonQuery();
com.CommandText = "COMMIT TRANSACTION";
com.ExecuteNonQuery();
com.CommandText = "ROlLBACK TRANSACTION";
com.ExecuteNonQuery();

com.CommandText = "SELECT COUNT(*) FROM testTable ";

MessageBox.Show(string.Format("Found {0} rows.", com.ExecuteScalar()));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top