[pgsql-jp: 37811] Re: UPDATE が集中するとデッドロックが発生する

Kiyoshi Mizuno kiyoshi_mizuno @ mail.toyota.co.jp
2006年 12月 18日 (月) 19:00:05 JST


水野です。

> -----Original Message-----
> Perl の CGI で DBI を使用して PostgreSQL 8.1.4 に接続し、約 180,000
> レコード入っているテーブルのうち、一つの列の条件で絞り込んだ 3,000 件
> 程を update する SQL を実行しています。
> AutoCommit は使用せず、エラー判定により commit/rollback しています。
(中略)
> どちらのトランザクションも、where 条件を含めて 同じ UPDATE 文を実行
> しています。この CGI では UPDATE の前に "SET CLIENT_ENCODING TO SJIS"
> しか実行していません。デッドロックは、同じ UPDATE 文が同時に実行され
> ているだけでも発生するものなのでしょうか。

ロックモードにもよるでしょうが、WHERE条件によっては
起き得るように思います。

IndexとFlagしかないテーブルがあったとして、
 Update Flag = true WHERE 30<=Index and Index<= 40;
 Update Flag = true WHERE 35<=Index and Index<= 45;
という2つのSQLを同時実行させるとIndexが35から40のレコードは
2つのトランザクションで奪い合いになるのではないでしょうか。




pgsql-jp メーリングリストの案内