7

我对如何检查您是否在进行交易有类似的问题。我如何允许嵌套事务而不是检查?

我正在使用带有 ADO.NET 的 Microsoft SQL Server 数据库。我已经看到使用 T-SQL 的示例以及使用 begin 和使用事务名​​称启动事务的示例。调用 connection.BeginTransaction 时,我在同一个连接中调用另一个函数,它再次调用 BeginTransaction,这给了我异常:

SqlConnection does not support parallel transactions.

似乎许多 Microsoft 变体都允许这样做,但我不知道如何使用我的 .mdf 文件来做到这一点。

如何允许使用 C# 和 ADO.NET 与 Microsoft SQL Server 数据库进行嵌套事务?

4

3 回答 3

8

SQL Server 作为一个整体不支持嵌套事务。BEGIN TRAN在 T-SQL 中,您可以在前面发出 a ,BEGIN TRAN但这只是为了方便。只有外部交易才重要。SQL Server ( SqlConnection) 的 .NET 客户端甚至不允许您这样做,并在您尝试时抛出此异常。

于 2010-05-18T20:28:52.743 回答
4

SQL Server 支持嵌套事务是一个常见的误解。它不是。打开多个事务然后调用 commit 绝对没有任何作用。您可以轻松编写一些测试 SQL 来自己尝试。此处模拟嵌套事务的唯一选择是使用保存点。

我应该补充一点,唯一重要的是当@@TRAN_COUNT 达到零时,只有外部事务将被提交。

于 2012-12-07T17:21:04.993 回答
0
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()));
于 2012-06-08T06:30:34.847 回答