[pgsql-jp: 40179] Re: update文のフリーズ

Eiichiro Sakai sakai @ agate-japan.com
2010年 2月 17日 (水) 14:39:00 JST


fujii様

お世話になります。
酒井です。

早速のご返信ありがとうございます。

> このとき、pg_stat_activity では pid = 28636 はどのような内容になっていたで
> しょうか?
> "waiting" 列が "t" となっていた場合は、UPDATE 文はロックで待たされていま
す。

こちらですが、その当時postgresのSQLが滞留していたため、コネクションが最大値
に
到達してしていて状況を確認できませんでした。
当時のpg_dumpで取得したdumpファイルはあるのですが、他環境でリストアすると
pg_stat_activityがきれいになってしまってその状況が判明していない状況です。
その当時のdumpファイルをそっくりそのまま復元することができれば確認できるので
すが、
なにか手段などご存知であればご教授いただければと思います。

> その場合は、
> UPDATE 文と競合する SQL が他になかったか確認してみてください。

こちら再度確認してみますが、他にはなかったと思います。

> 例えば、SELECT FOR UPDATE では where 句の条件は "AAA_id = $1" のみですが、
> UPDATE 文
> では "AAA_id = $15 and VERSION = $16" と条件が増えています。このため、
VERSION
>> 条件に SELECT FOR UPDATE 等を行っている SQL が他に存在すると、UPDATE 文だ
け
> 競合が
> 発生することになります。

すいません、認識が間違ってるかもしれませんが、
結果が同一行に特定される場合でもselect for update等でwhere句の条件が
異なる場合ロックを取得できてしまうのでしょうか?
(この場合同一行に二つの行ロックがかかっている状況になってしまうと思うのです
が・・)

以上よろしくお願いします。


> -----Original Message-----
> From: Fujii Masao [mailto:masao.fujii @ gmail.com]
> Sent: Wednesday, February 17, 2010 1:53 PM
> To: Eiichiro Sakai
> Cc: PostgreSQL Japanese Mailing List
> Subject: Re: [pgsql-jp: 40175] Re: update文のフリーズ
>
> 2010/2/17 Eiichiro Sakai <sakai @ agate-japan.com>:
> > 1についてですが、SQLログというのはpostgresサーバで出力されているログで
> > 「log_min_duration_statement = 0」にして出力しております。
> > ログの抜粋を下記添付させていただきますが、下記出力後同一pid(28636)のログ
>> > 出力されていない状況となっておりました。
> > fujii様よりexecute messageが届いてるかどうかというご指摘をいただいたの
> です
> > が、
> > ログを見るとSQL文を実行される際、最後のupdate文で「parse」「bind」が出力
> され
> > ていて、
> > 「execute」が出力されていない状況です。
> > 「bind」と「execute」の間はpostgres内部の処理と認識していたので、
> > SQLの実行メッセージは届いていると認識しておりました。
>
> 了解しました。
>
> > 2010-02-10 13:00:31 JST [28636] LOG:  duration: 0.081 ms  parse
<unnamed>:
> > update AAA set column_1 = $1, column_2 = $2, column_3 = $3, column_4 =
$4,
> > column_5 = $5, column_6 = $6, column_7 = $7, column_8 = $8, column_9 =
$9,
> > column_10 = $10, column_11 = $11, column_12 = $12, column_13 = $13,
> > column_14 = $14, VERSION = VERSION + 1 where AAA_id = $15 and VERSION =
$16
> > 2010-02-10 13:00:31 JST [28636] LOG:  duration: 0.097 ms  bind
<unnamed>:
> > update AAA set column_1 = $1, column_2 = $2, column_3 = $3, column_4 =
$4,
> > column_5 = $5, column_6 = $6, column_7 = $7, column_8 = $8, column_9 =
$9,
> > column_10 = $10, column_11 = $11, column_12 = $12, column_13 = $13,
> > column_14 = $14, VERSION = VERSION + 1 where AAA_id = $15 and VERSION =
$16
> > 2010-02-10 13:00:31 JST [28636] DETAIL:  parameters: $1 = 'xxx', $2 =
'xxx',
> > $3 = 'xxx', $4 = 'xxx', $5 = 'xxx', $6 = 'xxx', $7 = 'xxx', $8 = 'xxx',
$9
> =
> > 'xxx', $10 = 'xxx', $11 = 'xxx', $12 = 'xxx', $13 = 'xxx', $14 = 'xxx',
$15
> > = '9', $16 = 'xxx'
>
> このとき、pg_stat_activity では pid = 28636 はどのような内容になっていたで
> しょうか?
> "waiting" 列が "t" となっていた場合は、UPDATE 文はロックで待たされていま
す。
> その場合は、
> UPDATE 文と競合する SQL が他になかったか確認してみてください。
>
> 例えば、SELECT FOR UPDATE では where 句の条件は "AAA_id = $1" のみですが、
> UPDATE 文
> では "AAA_id = $15 and VERSION = $16" と条件が増えています。このため、
VERSION
>> 条件に SELECT FOR UPDATE 等を行っている SQL が他に存在すると、UPDATE 文だ
け
> 競合が
> 発生することになります。
>
> --
> Fujii Masao
> NIPPON TELEGRAPH AND TELEPHONE CORPORATION
> NTT Open Source Software Center



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