事务必须在SQL Server中的存储过程中吗?

nav*_*eed 1 .net c# sql-server sql-server-2008

我有一堆更新和插入查询,我从我需要在事务中的C#代码调用.我宁愿将它们保存在C#中,而不是使用存储过程.我使用SQLCommand.ExecuteNonQuery()来开始并提交事务.它工作正常,直到我尝试提交事务,当我收到"COMMIT TRANSACTION请求没有相应的BEGIN TRANSACTION"的消息时.我正在关闭通话之间的联系.这是问题吗?

Jon*_*nor 5

不,他们没有.

如果您希望事务跨越数据库连接甚至不同的数据库(Distributed Transaction),可以直接在连接本身上控制C#中的事务,或者使用System.Transactions命名空间使用环境事务.

如果要关闭调用之间的连接,请使用System.Transactions命名空间来控制事务.然后,该事务将跨越连接.

使用System.Transactions命名空间的一些基本代码:

using (TransactionScope scope = new TransactionScope())
{
     //Do operation 1 on connection 1 (open close connection)
     //Do operation 2 on connection 2 (open close connection)

     scope.Complete();
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的答案,但我会添加一些东西.首先,当您使用TransactionScope时,您涉及MSDTC,因此如果它决定将事务升级为分布式事务,则需要确保已配置MSDTC并且防火墙端口已打开.其次,这更像是对初始问题的引用而不是你的答案,就是当你在C#中打开/关闭连接时,通常不会将1:1映射到单独的sql连接/ spid,因为驱动程序将池连接. (2认同)