明示的なLOCK
は必要ありません デッドロックに陥ります。これは、INSERTのみを使用した非常に単純なデモです。
create table a(i int primary key);
create table b(i int primary key);
セッション#1の内容:
begin;
insert into a values(1);
次に、セッション#2は次のことを行います。
begin;
insert into b values(1);
insert into a values(1);
-- here it goes into waiting for session #1 to finish its transaction
次に、セッション#1は次のことを行います。
insert into b values(1);
そして、デッドロックが発生します:
同じことが、単純なUPDATE、またはUPDATEとINSERTの組み合わせでも発生する可能性があります。これらの操作は暗黙的なロックを取得し、異なるセッションで異なる順序で発生すると、デッドロックが発生する可能性があります。