我有一个 SQL Server 存储过程,它创建如下所示的 TRANSACTION:
BEGIN TRY
BEGIN TRANSACTION
INSERT INTO Table1 ...
INSERT INTO Table2 ...
COMMIT
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
END CATCH
此存储过程将插入到两个单独的表中。如果其中之一失败,它将回滚。
我还有以下用于创建事务范围的 .net 代码:
using( var scope = new TransactionScope() )
{
SqlCommand cmd1 = connection.CreateCommand();
SqlCommand cmd2 = connection.CreateCommand();
// ...
cmd1.ExecuteNonQuery();
cmd2.ExecuteNonQuery();
scope.Complete();
}
如果我的存储过程和代码都在创建事务,会发生什么情况?这会导致问题/需要成为分布式事务吗?或者只要我只创建一个到数据库的连接就可以吗?
最佳答案
除非您有充分的理由,否则我只会在一个地方或另一个地方进行交易。
如果可能的话,我会让那个地方成为数据库。这减少了往返次数,更容易测试,将其与系统的其他组件隔离,减少暴露的数据库表面积,并通过强制操作通过明确定义的接口(interface)来保护数据库外围完整性。
关于c# - 存储过程中的事务 + 客户端代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7587298/