我正在尝试在用 C# 编写的高度并发系统中执行以下操作。
- 获取事务范围内数据项的行锁
- 做很多 db-interaction
- 如果出现任何问题
- 更新锁定的数据项,处理失败
- 提交更新
- 回滚步骤 2 中的任何更改并释放对数据项的锁定
但是 - 我不知道如何实现这一点,而不是在更新之前释放项目锁定。我目前的(坏的)解决方案是这样的:
- 获取事务范围内数据项的行锁
- 做很多 db-interaction
- 如果出现任何问题
- 回滚步骤 2 中的任何更改并释放对数据项的锁定
- 在新事务范围内重新锁定数据项
- 更新锁定的数据项,处理失败
- 提交更新
这个解决方案的问题是我释放了锁,以便另一个进程可以在我更改写入处理失败的项目之前拿起项目。
有没有办法创建一个嵌套事务范围,它可以提交被外部事务范围锁定的项目,同时仍然允许外部范围回滚?
看来我所有的麻烦都来自这样一个事实,即外部范围锁定了内部范围要更新的项目。