提交内部事务范围,同时回滚外部事务范围
本文关键字:范围 外部 事务 内部事务 提交 | 更新日期: 2023-09-27 18:02:54
我正在尝试在一个用c#编写的高度并发系统中执行以下操作。
- 在事务范围 中获取数据项的行锁
- 做很多db交互
- 如果出了什么问题
- 更新锁定的数据项,处理失败
- 提交更新
- 回滚步骤2中的任何更改并释放数据项 上的锁
然而,我不知道如何实现这一点,而不释放项目锁做更新之前。我目前的(坏的)解决方案是:
- 为事务范围内的数据项获取行锁
- 做很多db交互
- 如果出了什么问题
- 回滚步骤2中的任何更改并释放数据项 上的锁
- 更新锁定的数据项,处理失败
- 提交更新
这个解决方案的问题是,我释放了锁,这样另一个进程就可以在我更改写处理失败的项目之前拾取该项目。
是否有办法创建一个嵌套的事务作用域,可以提交一个被外部事务作用域锁定的项目,同时仍然允许外部作用域回滚?
似乎我所有的麻烦都来自于这样一个事实,即外部作用域对内部作用域想要更新的项有一个锁。
我对这个问题的理解是,你的要求是不可能的。
有什么东西阻止你使用类似的模式吗?
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