0

C# で記述された高度な並行システムで次のことを実行しようとしています。

  1. トランザクション スコープ内のデータ項目で行ロックを取得する
  2. 多くのデータベース操作を行う
  3. 何か問題が発生した場合
    • 処理に失敗したロックされたデータ項目を更新する
    • 更新をコミット
    • ステップ 2 のすべての変更をロールバックし、データ項目のロックを解除します

ただし、更新を行う前にアイテムのロックを解除せずに、これを達成する方法がわかりません。私の現在の(悪い)解決策はこれです:

  1. トランザクション スコープ内のデータ項目で行ロックを取得する
  2. 多くのデータベース操作を行う
  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 に答える