存储过程+客户端代码中的事务
本文关键字:事务 代码 客户端 存储过程 | 更新日期: 2023-09-27 18:10:09
我有一个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();
}
如果我的存储过程和我的代码都在创建一个事务,会发生什么?这是否会导致问题/需要是分布式事务,或者只要我只创建一个到数据库的连接就可以?
除非你有很好的理由,否则我只会在其中一个地方进行交易。
如果可能的话,我会让那个地方成为数据库。这减少了往返,更容易测试,将其与系统的其他组件隔离,减少了暴露的数据库表面积,并通过强制操作通过定义良好的接口来保护数据库周界的完整性。
在这个场景中,如果一个存储过程失败,它将使用内部事务回滚。您的代码将认为它已经完成并提交分布式事务。这是你想要的吗,因为分布式事务是毫无意义的,因为每个事务都将单独运行。
如果您希望两者都运行或都不运行,请将事务从存储过程中删除,只使用分布式事务。