1

与えられた2つのテーブル:

  • Company[ id, name, balance]
  • Employee[ id, name, company_id]

会社とその依存関係を削除したいのですが、実際のプロジェクトでは会社に複数のレベルの依存関係があり、複雑すぎて単一のSQLステートメントに絞り込めないため、アトミックに削除できません。さらに、https://stackoverflow.com/a/5598275/14731を見ると、単一のSQLステートメントがアトミックであるかどうかはわかりません。

代わりに私はこれを行います:

  1. SELECT ... FOR UPDATE会社に関連するすべての従業員(トランザクションの途中で変更されないようにロックします)
  2. 各従業員を1人ずつ削除します
  3. 親会社を削除します。

1つの落とし穴があります。会社を参照する新しいレコードがステップ1と2の間に挿入されないようにするにはどうすればよいですか。https://stackoverflow.com/a/3602125/14731 によると、SELECT ... FOR UPDATE挿入をブロックしません。理想的には、会社を指す可能性のあるすべての種類の依存関係ごとに1つのロックではなく、会社にロックを設定したいと思います。

更新:私はアイデアを持っていますが、それが理にかなっているかどうかはわかりません。

会社を指す新しいレコードを挿入したい場合は、それが存在することを確認するために検索する必要があります。ステップ1の前に会社にいる場合はSELECT ... FOR UPDATE、読み取りをブロックして、後続の挿入を遅らせる必要があります。2つの質問があります。

  1. Does SELECT ... FOR UPDATE block normal SELECT queries? If not, I'd have to ensure that inserting threads always use SELECT ... FOR UPDATE when looking up the Company.
  2. Would this approach work?
4

1 に答える 1

0

Here is one possible solution:

  1. The thread that inserts new associations should establish a read lock on the Company (using REPEATABLE_READ isolation or SELECT ... FOR SHARE)
  2. The thread that deletes the Company should write lock the row using SELECT ... FOR UPDATE.
  3. The write lock will wait for all outstanding read locks to be released and will prevent new read locks from being established until the DELETE operation is complete.
于 2013-05-14T03:01:45.267 に答える