使用TransactionScope执行包含BEGIN TRANS - COMMIT TRANS的多个SP

时间:2012-05-30 12:37:58

标签: sql-server sql-server-2008 transactions transactionscope

当在一个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中提交会怎么样?

  1. 一切都回滚
  2. 提交了SP2中的3个语句。其他所有东西都会回滚?
  3. 我不知道它是否重要但是以防万一,所有三个SP都是使用一个连接对象执行的,连接正在关闭并在两个ExecuteNonQuery语句之间再次打开。

1 个答案:

答案 0 :(得分:2)

始终只有一个事务,最外层事务由最外层事务范围启动。在最外层事务范围内发生的所有其他内部事务范围和T-SQL代码中的所有其他BEGIN TRANSACTION都只是@@TRANCOUNT的美化增量,所有这些COMMITS只是相同的减量。只有最后一个COMMIT才重要,直到那时事务还没有提交。

因此在您的示例中,SP2没有提交任何内容。它只是将@@ TRANCOUNT递增到2,然后将其递减回1.事务仍处于活动状态,当C#代码抛出时,事务将回滚。

作为旁注,请参阅Exception handling and nested transactions,了解如何编写良好的异常安全存储过程的模板。