【发布时间】:2013-03-07 18:52:59
【问题描述】:
我正在尝试在用 C# 编写的高并发系统中执行以下操作。
- 获取事务范围内数据项的行锁
- 做大量的数据库交互
- 如果出现任何问题
- 更新锁定的数据项,处理失败
- 提交更新
- 回滚第 2 步中的任何更改并解除对数据项的锁定
但是 - 我不知道如何实现这一点,而不是在更新之前释放项目锁定。我目前的(坏的)解决方案是这样的:
- 获取事务范围内数据项的行锁
- 做大量的数据库交互
- 如果出现任何问题
- 回滚第 2 步中的任何更改并解除对数据项的锁定
- 在新事务范围内重新获取数据项锁定
- 更新锁定的数据项,处理失败
- 提交更新
此解决方案的问题在于,我释放了锁,以便另一个进程可以在我更改写入处理失败的项目之前获取该项目。
有没有办法创建一个嵌套事务范围,它可以提交被外部事务范围锁定的项目,同时仍然允许外部范围回滚?
看来我所有的麻烦都来自这样一个事实,即外部范围锁定了内部范围要更新的项目。
【问题讨论】:
-
我认为这是不可能的。回滚的内部事务也会回滚未提交的外部事务。
标签: c# sql database transactions transactionscope