提交内部事务范围,同时回滚外部事务范围

时间:2013-03-07 18:53:00

标签: c# sql database transactions transactionscope

我试图在用C#编写的高度并发系统中执行以下操作。

  1. 在事务范围内的数据项上获取行锁定
  2. 做了很多db-interaction
  3. 如果出现任何问题
    • 更新锁定的数据项,处理失败
    • 提交更新
    • 回滚步骤2中的所有更改并释放数据项锁定
  4. 然而 - 我不知道如何实现这一点,而不是在进行更新之前释放项锁。我当前(坏)的解决方案是:

    1. 在事务范围内的数据项上获取行锁定
    2. 做了很多db-interaction
    3. 如果出现任何问题
      • 回滚步骤2中的所有更改并释放数据项锁定
      • 重新锁定新交易范围内的数据项
      • 更新锁定的数据项,处理失败
      • 提交更新
    4. 这个解决方案的问题在于我释放了锁定,以便在我更改写入处理失败的项目之前,另一个进程可以获取该项目。

      有没有办法创建一个嵌套的事务范围,它可以提交由外部事务范围锁定的项目,同时仍然允许外部范围回滚?

      看来我的所有麻烦都来自这样一个事实,即外部范围对内部范围想要更新的项目有锁定。

1 个答案:

答案 0 :(得分:0)

我理解这个问题的方式,你要求的是不可能的。

是否有任何阻止您使用与此类似的模式?

begin outer transaction

  //do some stuff

  bool failedFlag = false;

  begin inner transaction

    // do some more stuff

    if (failed)
      failedFlag = true
      roll back inner transaction
    else
      commit inner transaction
  end inner

  if (failedFlag)
    update locked items with failed status

commit outer transaction