与えられた2つのテーブル:
Company
[id, name, balance
]Employee
[id, name, company_id
]
会社とその依存関係を削除したいのですが、実際のプロジェクトでは会社に複数のレベルの依存関係があり、複雑すぎて単一のSQLステートメントに絞り込めないため、アトミックに削除できません。さらに、https://stackoverflow.com/a/5598275/14731を見ると、単一のSQLステートメントがアトミックであるかどうかはわかりません。
代わりに私はこれを行います:
SELECT ... FOR UPDATE
会社に関連するすべての従業員(トランザクションの途中で変更されないようにロックします)- 各従業員を1人ずつ削除します
- 親会社を削除します。
1つの落とし穴があります。会社を参照する新しいレコードがステップ1と2の間に挿入されないようにするにはどうすればよいですか。https://stackoverflow.com/a/3602125/14731 によると、SELECT ... FOR UPDATE
挿入をブロックしません。理想的には、会社を指す可能性のあるすべての種類の依存関係ごとに1つのロックではなく、会社にロックを設定したいと思います。
更新:私はアイデアを持っていますが、それが理にかなっているかどうかはわかりません。
会社を指す新しいレコードを挿入したい場合は、それが存在することを確認するために検索する必要があります。ステップ1の前に会社にいる場合はSELECT ... FOR UPDATE
、読み取りをブロックして、後続の挿入を遅らせる必要があります。2つの質問があります。
- Does
SELECT ... FOR UPDATE
block normalSELECT
queries? If not, I'd have to ensure that inserting threads always useSELECT ... FOR UPDATE
when looking up the Company. - Would this approach work?