:私はREPEATABLE_READまたはSERIALIZABLEトランザクション分離を使用していますINSERT操作でデッドロックが発生する可能性がありますか?仮定
- は、我々は同時に複数のテーブルにアクセスする複数のスレッドを話している
- (ロックは毎回私が行にアクセスを保持します)。
私は、次の質問がある:
- は、デッドロックが発生する
INSERT
操作のため、それは可能ですか?もしそうなら、デッドロックがどのように起こるかを示す詳細なシナリオを提示してください(例えば、スレッド1はこれを行い、スレッド2はそれを行います...、デッドロック)。 - ボーナスポイントの場合:他のすべての操作について同じ質問に答えます(SELECT、UPDATE、DELETEなど)。
UPDATE: スーパーボーナスポイント3.:どのように私は次のシナリオでは、デッドロックを避けることができますか?
考えるテーブル:
- 権限次のように私は新しい会社を作成
[id BIGINT PRIMARY KEY]
- 企業
[id BIGINT PRIMARY KEY, name VARCHAR(30), permission_id BIGINT NOT NULL, FOREIGN KEY (permission_id) REFERENCES permissions(id))
:
- INSERT INTOを権限。 - inserts permissions.id = 100
- INSERT INTOの会社(名前、許可ID)VALUES( 'Nintendo'、100); - インサートcompanies.id = 200
次のように私は会社を削除します。
- SELECTは、ID = 200の企業からpermission_id。 - 戻り値permission_id = 100
- id = 200の会社から削除します。
- 権限からの削除WHERE id = 100;
上記の例では、INSERTロック順序は[permissions、companies]ですが、DELETEロック順序は[companies、permissions]です。 REPEATABLE_READ
またはSERIALIZABLE
アイソレーションのこの例を修正する方法はありますか?
(単一のトランザクションで)単一のユーザーとして定義されたシナリオ、挿入選択し、削除がデッドロックが発生するつもりはありません。 –
@CleverIdeaWidgetryは、私たちは、複数のスレッドやテーブルの話をしているという事実を反映するために質問を明らかにしました。 – Gili
あなたの基本的な質問に対する答えは「できますか?」他人が言ったように、はいです。自分のシナリオをテストするのを妨げる障害がいくつかありますか?それは私の特定のデータベースでのデッドロックせずに働くかもしれないという理由だけで –