仮定:
次の質問があります。
INSERT
操作でデッドロックが発生する可能性はありますか?その場合、デッドロックが発生する方法を示す詳細なシナリオを提供してください(たとえば、スレッド1がこれを実行し、スレッド2がそれを実行します) ...、デッドロック)。[〜#〜] 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ロック順序は[許可、会社]ですが、DELETEロック順序は[会社、許可]です。 _REPEATABLE_READ
_またはSERIALIZABLE
分離のこの例を修正する方法はありますか?
一般に、すべての変更はデッドロックを引き起こす可能性があり、selectはそれを引き起こしません(後で取得します)。そう
複数のテーブルは必要ありません。
デッドロックを作成する最良の方法は、同じことを異なる順序で行うことです。
SQL Serverの例:
create table A
(
PK int primary key
)
セッション1:
begin transaction
insert into A values(1)
セッション2:
begin transaction
insert into A values(7)
セッション1:
delete from A where PK=7
セッション2:
delete from A where PK=1
デッドロックが発生します。そのため、挿入と削除がデッドロックになる可能性があります。
更新は似ています:
セッション1:
begin transaction
insert into A values(1)
insert into A values(2)
commit
begin transaction
update A set PK=7 where PK=1
セッション2:
begin transaction
update A set pk=9 where pk=2
update A set pk=8 where pk=1
セッション1:
update A set pk=9 where pk=2
デッドロック!
SELECTはデッドロックを起こすべきではありませんが、データベースによっては、使用するロックが一貫した読み取りを妨害するため、デッドロックが発生します。ただし、これはデータベースエンジンの設計がひどいものです。
SNAPSHOT ISOLATIONを使用する場合、SQL ServerはSELECTをロックしません。 Oracleと私はPostgresがSELECTをロックしないと思います(とにかく更新のために予約されているFOR UPDATEがない限り)。
だから基本的に私はあなたがいくつかの誤った仮定を持っていると思います。私は証明したと思います:
SELECTで私のWordを使用する必要があります;)しかし、それはDBと設定に依存します。
LoztInSpaceの回答に加えて、inserts
はdeletes
またはupdates
が存在しなくてもデッドロックを引き起こす可能性があります。必要なのは、一意のインデックスと逆の操作順序だけです。
Oracleでの例:
create table t1 (id number);
create unique index t1_pk on t1 (id);
--thread 1 :
insert into t1 values(1);
--thread 2
insert into t1 values(2);
--thread 1 :
insert into t1 values(2);
--thread 2
insert into t1 values(1); -- deadlock !
2つのリレーションA
とB
があり、2人のユーザーX
とY
があるとします。テーブルAはユーザーXによって書き込みロックされ、テーブルBはYによって書き込みロックされます。次に、ユーザーXとユーザーYの両方が使用すると、次のクエリはデッドロックを生成します。
Select * from A,B
したがって、複数のテーブルを含む結合操作がその一部である場合、Select
操作はデッドロックを引き起こす可能性があります。通常、挿入および削除操作には単一の関係が含まれます。したがって、デッドロックが発生することはありません。