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

本文关键字:范围 外部 事务 内部事务 提交 | 更新日期: 2023-09-27 18:02:54

我正在尝试在一个用c#编写的高度并发系统中执行以下操作。

  1. 在事务范围
  2. 中获取数据项的行锁
  3. 做很多db交互
  4. 如果出了什么问题
    • 更新锁定的数据项,处理失败
    • 提交更新
    • 回滚步骤2中的任何更改并释放数据项
    • 上的锁

然而,我不知道如何实现这一点,而不释放项目锁做更新之前。我目前的(坏的)解决方案是:

  1. 为事务范围内的数据项获取行锁
  2. 做很多db交互
  3. 如果出了什么问题
    • 回滚步骤2中的任何更改并释放数据项
    • 上的锁
  4. 更新锁定的数据项,处理失败
  5. 提交更新

这个解决方案的问题是,我释放了锁,这样另一个进程就可以在我更改写处理失败的项目之前拾取该项目。

是否有办法创建一个嵌套的事务作用域,可以提交一个被外部事务作用域锁定的项目,同时仍然允许外部作用域回滚?

似乎我所有的麻烦都来自于这样一个事实,即外部作用域对内部作用域想要更新的项有一个锁。

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

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

有什么东西阻止你使用类似的模式吗?

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