[pgpool-general-jp: 1073] トランザクション範囲外のupdate がwaitになる

甲斐寛大 kai.t @ opst.co.jp
2012年 7月 13日 (金) 13:48:49 JST


甲斐ともうします。

以下に示す環境にて、トランザクション範囲外のupdateがwaitになる
事象が発生しており、ご質問をさせていただきたくご連絡をしました。

●環境(ざっくりで申し訳ございませんが)
 CentOS 5.7 (64bit)
 pgpool-ii 3.0.2
  num_init_children = 120 (こちらを150や200にしても同様の事象が発生します)
  max_pool = 1

 PostgreSQL 8.4.5
 DBは3台で、うち2台にのみ参照を負荷分散してます

●事象
トランザクションをかけていないupdate文がwaiting状態となります。

pgpoolでのpg_stat_activityを見ると、

 procpid |   waiting |                         current_query
   28991 | t        | UPDATE table_a SET column_text1 = $1,
column_text2 = $2 WHERE (column_flg = 1) AND (column_id = 40) AND
(column_text2 = 0) AND ((column_date >= '2012-01-01' AND column_date
<= '2012-12-30'))
   28871 | f        | UPDATE "table_a" SET "column_date" =
"timestamptz"($2::text), "column_id" = 40 WHERE
("column_id2"=15408745 )

のようになっており、28991がロック待ちに見え、
次いで28871が28991の終了を待っている?ように見えますが、waitingはfです。

気になる点としては、28991のフロントからの要求はトランザクションが切られていないupdateでして
28871のupdateはトランザクションブロック内でのupdateです。
トランザクションが切られていない場合のupdate文については、バックエンドのpostgresに投げる
SQL順序の制御ができないという認識で正しいでしょうか?

pgpoolから各ノードへの更新順序が逆転をしてしまい、バックエンド側でたすきがけ状態に
なってしまっているのかなとも思いましてメールをいたしました。
(とはいえ、pgpoolがトランザクション外の更新についても各バックエンドのpostgresに対してロックを
 かけることが前提になりますが・・・)


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