0

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

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

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

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

这个解决方案的问题是我释放了锁,以便另一个进程可以在我更改写入处理失败的项目之前拿起项目。

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

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

4

1 回答 1

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
于 2013-03-07T19:02:14.773 回答