C# で記述された高度な並行システムで次のことを実行しようとしています。
- トランザクション スコープ内のデータ項目で行ロックを取得する
- 多くのデータベース操作を行う
- 何か問題が発生した場合
- 処理に失敗したロックされたデータ項目を更新する
- 更新をコミット
- ステップ 2 のすべての変更をロールバックし、データ項目のロックを解除します
ただし、更新を行う前にアイテムのロックを解除せずに、これを達成する方法がわかりません。私の現在の(悪い)解決策はこれです:
- トランザクション スコープ内のデータ項目で行ロックを取得する
- 多くのデータベース操作を行う
- 何か問題が発生した場合
- ステップ 2 のすべての変更をロールバックし、データ項目のロックを解除します
- 新しいトランザクション スコープでデータ項目のロックを再取得する
- 処理に失敗したロックされたデータ項目を更新する
- 更新をコミット
このソリューションの問題は、処理が失敗したアイテムに変更を書き込む前に、別のプロセスがアイテムを取得できるように、ロックを解除することです。
ネストされたトランザクション スコープを作成し、外側のトランザクション スコープによってロックされたアイテムをコミットできる一方で、外側のスコープをロールバックできるようにする方法はありますか?
私のすべての問題は、外側のスコープが内側のスコープが更新したいアイテムをロックしているという事実から来ているようです。