3

当 BEGIN TRANS - COMMIT TRANS 在一个 SP 中完成并在 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 个语句被提交。其他一切都回滚了吗?

我不知道这是否重要,但以防万一,所有三个 SP 都使用一个连接对象执行,并且连接正在关闭并在两个 ExecuteNonQuery 语句之间再次打开。

4

1 回答 1

2

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

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

作为旁注,请参阅异常处理和嵌套事务,了解如何编写良好的异常安全存储过程的模板。

于 2012-05-30T13:07:18.570 回答