经过一番搜索,我发现了另一个“堆栈溢出”问题。事实证明,您不能在ADO.NET中嵌套事务。尝试时,您可能最终会启动两个不相关的事务,这会导致并行事务错误。
要查看连接当前是否在事务中,可以执行以下操作:
var com = yourConnection.CreateCommand();com.CommandText = "select @@TRANCOUNT";var trancount = com.ExecuteScalar();
这将返回嵌套事务的数量。
请注意,您可以手动嵌套事务,而无需使用SqlTransaction对象。例如:
var com = yourConnection.CreateCommand();com.CommandText = "BEGIN TRANSACTION";com.ExecuteNonQuery();com.CommandText = "BEGIN TRANSACTION";com.ExecuteNonQuery();com.CommandText = "INSERT INTO TestTable (name) values ('Joe');";com.ExecuteNonQuery();com.CommandText = "COMMIT TRANSACTION";com.ExecuteNonQuery();com.CommandText = "ROlLBACK TRANSACTION";com.ExecuteNonQuery();com.CommandText = "SELECT COUNT(*) FROM TestTable";Console.WriteLine("Found {0} rows.", com.ExecuteScalar());这将打印
0,因为嵌套事务已完全中止。



