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

YuGo yu.gotou @ gtec-ni.com
2006年 12月 18日 (月) 18:12:31 JST


こんにちは。
http://www.postgresql.jp/document/pg814doc/html/explicit-locking.html#LOCKING-ROWS
行レベルロックは明示的にロックしなくても発生する可能性があります、と書い
てありますね。

できるかどうか知りませんが、updateをorder by で順序をつけてやったらどう
ですか。


maya wrote:
> 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 文が同時に実行され
> ているだけでも発生するものなのでしょうか。
> 
> よろしくお願いいたします。
> 



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