我有一个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();
}
如果我的存储过程和代码都在创建事务,会发生什么?这是否会导致问题/需要成为分布式事务,或者只要我只创建一个与数据库的连接就可以了吗?
答案 0 :(得分:3)
除非你有充分的理由,否则我只会在一个地方或另一个地方进行交易。
如果可能的话,我会把那个地方当成数据库。这减少了往返次数,更容易测试,将其与系统的其他组件隔离,减少了暴露的数据库表面区域,并通过强制操作通过定义明确的界面来保护数据库边界的完整性。
答案 1 :(得分:0)
在这种情况下,如果您的某个存储过程失败,它将使用内部事务回滚。您的代码将认为它已完成并提交分布式事务。这是你想要的,因为分散的交易毫无意义,因为每个交易都会单独运行。
如果您想要同时运行或两者都不运行,请从存储的过程中删除您的事务,并使用分布式事务。