我有一个.net网页,其中调用了两个存储过程。 这两个都在sql server中有begin-commit事务。我也会多次调用第二个proc,具体取决于条件。
我想将整个流程包装在一个事务中。我环顾四周,发现C#中的Sqltransaction和TransactionScope clases将在这种情况下帮助我。
但是我从来没有使用它们,总是在sql server中使用事务,因此不知道.Net中的事务是否会出现问题,因为我的存储过程在Sql Server中都有自己的Begin-commit事务。
如果他们发生冲突,是否有办法让他们在单一交易下工作?
答案 0 :(得分:1)
是的,可以从.Net调用(例如现有的或遗留的)存储过程,它使用.Net BEGIN TRAN
下的手册COMMIT TRAN
,ROLLBACKs
/ TransactionScope
。 ,或者如果您从SqlTransaction
管理交易。 (虽然要说明显而易见的,如果你可以避免使用多种交易技术,那么就这样做。)
对于“快乐案例”场景,当调用@@TRANCOUNT
事务时,将会增加SPROC
(就像SqlServer中的嵌套事务一样)。事务仅在@@TRANCOUNT
在连接的最外层提交后达到零时提交。即inner commits
只会减少@@TRANCOUNT
。但请注意,对于ROLLBACKS
,情况并非如此 - 除非您使用SAVEPOINTS,否则任何回滚都将回滚整个事务。您需要非常小心地匹配@@TRANCOUNTs
。
您对TransactionScope
vs SqlTransaction
听起来有点犹豫不决。 TransactionScope
更通用,因为它可以跨越单阶段和分布式事务(使用DTC
)。但是,如果您只需要在单个连接,同一个数据库上协调事务,那么SqlTransaction
也可以。