当在一个SP中完成BEGIN TRANS-COMMIT TRANS并在TransactionScope中执行多个SP并在完成范围之前抛出错误时会发生什么。
所以伪代码如下
//Using TransactionScope() {
// executing SP1
// executing SP2
// executing SP3
// throw new Exception();
//}
SP2包含以下代码。
// BEGIN TRANS
// Update Statement1
// Update Statement2
// Update Statement3
// COMMIT TRANS
如果我们假设事务在SP2中提交会怎么样?
我不知道它是否重要但是以防万一,所有三个SP都是使用一个连接对象执行的,连接正在关闭并在两个ExecuteNonQuery语句之间再次打开。
答案 0 :(得分:2)
始终只有一个事务,最外层事务由最外层事务范围启动。在最外层事务范围内发生的所有其他内部事务范围和T-SQL代码中的所有其他BEGIN TRANSACTION都只是@@TRANCOUNT
的美化增量,所有这些COMMITS只是相同的减量。只有最后一个COMMIT才重要,直到那时事务还没有提交。
因此在您的示例中,SP2没有提交任何内容。它只是将@@ TRANCOUNT递增到2,然后将其递减回1.事务仍处于活动状态,当C#代码抛出时,事务将回滚。
作为旁注,请参阅Exception handling and nested transactions,了解如何编写良好的异常安全存储过程的模板。