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

maya maya @ negeta.com
2006年 12月 18日 (月) 17:44:35 JST


maya と申します。

UPDATE 文が短時間に繰り返されると、デッドロックが発生します。
どうしてこうなるのか、教えていただけるでしょうか。

Perl の CGI で DBI を使用して PostgreSQL 8.1.4 に接続し、約 180,000
レコード入っているテーブルのうち、一つの列の条件で絞り込んだ 3,000 件
程を update する SQL を実行しています。
AutoCommit は使用せず、エラー判定により commit/rollback しています。

この CGI に、1秒間に15回ほどアクセスがなされる状態が続くと、下記のよう
になります。
> ERROR:  deadlock detected
> DETAIL:  Process 8473 waits for ShareLock on transaction 2283079; blocked by process 8417.
>         Process 8417 waits for ShareLock on transaction 2283137; blocked by process 8473.
どちらのトランザクションも、where 条件を含めて 同じ UPDATE 文を実行
しています。この CGI では UPDATE の前に "SET CLIENT_ENCODING TO SJIS"
しか実行していません。デッドロックは、同じ UPDATE 文が同時に実行され
ているだけでも発生するものなのでしょうか。

よろしくお願いいたします。

-- 
| maya <maya @ negeta.com> |



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