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

EBIHARA, Yuichiro ebihara @ iplocks.co.jp
2006年 12月 19日 (火) 12:28:59 JST


こんにちは、海老原です。

行ロックを獲るのと、ORDER BYで順序付けするのは内部的にどっちが先ですかね?
というのは、

> > 行レベルロックは明示的にロックしなくても発生する可能性があります、と書い
> > てありますね。
> > 
> > できるかどうか知りませんが、updateをorder by で順序をつけてやったらどう
> > ですか。
> 
> 内部的に行レベルロックが使用されていて、ロックされる順番が
> 一定ではないかもしれないのですね。
> ご提案頂いた order by は使用できませんでした。

UPDATEと同じWHERE句を使って、事前にSELECT ... ORDER BY ... FOR UPDATEをやって
おけばいいのかも、と思ったからです。
でも、多分行ロックが先だろうから、今までUPDATEで発生していたデッドロックが、
単にSELECT FOR UPDATEで発生するようになるだけか。

じゃあ、先にSELECT ... ORDER BYをやっておいて、あとはその結果を使って、1行
ずつUPDATEするとか。これなら複数リソース(この場合はレコード)に対するロック
獲得順序が同じになるからデッドロックは発生しませんが、問題のUPDATE文が一括
で更新するレコード数によってはパフォーマンスの低下が問題になりますね。

海老原





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