多个存储过程在.Net下进行1次交易

时间:2014-06-04 06:38:39

标签: c# asp.net sql-server transactions transactionscope

我有一个.net网页,其中调用了两个存储过程。 这两个都在sql server中有begin-commit事务。我也会多次调用第二个proc,具体取决于条件。

我想将整个流程包装在一个事务中。我环顾四周,发现C#中的Sqltransaction和TransactionScope clases将在这种情况下帮助我。

但是我从来没有使用它们,总是在sql server中使用事务,因此不知道.Net中的事务是否会出现问题,因为我的存储过程在Sql Server中都有自己的Begin-commit事务。

如果他们发生冲突,是否有办法让他们在单一交易下工作?

1 个答案:

答案 0 :(得分:1)

是的,可以从.Net调用(例如现有的或遗留的)存储过程,它使用.Net BEGIN TRAN下的手册COMMIT TRANROLLBACKs / TransactionScope。 ,或者如果您从SqlTransaction管理交易。 (虽然要说明显而易见的,如果你可以避免使用多种交易技术,那么就这样做。)

对于“快乐案例”场景,当调用@@TRANCOUNT事务时,将会增加SPROC(就像SqlServer中的嵌套事务一样)。事务仅在@@TRANCOUNT在连接的最外层提交后达到零时提交。即inner commits只会减少@@TRANCOUNT。但请注意,对于ROLLBACKS,情况并非如此 - 除非您使用SAVEPOINTS,否则任何回滚都将回滚整个事务。您需要非常小心地匹配@@TRANCOUNTs

您对TransactionScope vs SqlTransaction听起来有点犹豫不决。 TransactionScope更通用,因为它可以跨越单阶段和分布式事务(使用DTC)。但是,如果您只需要在单个连接,同一个数据库上协调事务,那么SqlTransaction也可以。