[pgcluster: 236] Re: デッドロックもしくはそれに類似した症状について
Wataru Oguro
oguro @ zenrin-datacom.net
2004年 3月 31日 (水) 20:57:48 JST
oguroです。お世話になります。
>>select for updateにするのが一般的であるのも分かっておりますが、同じ結果になりませんか?
>>
>>
>
>一応、私は実際に試験して問題がない事も確認しています。
>
私も試験をしてお話していたのですが、レプリケーションサーバ、クラスタサー
バ2台を再起動して試したところうまく動きました。(デッドロックのテストで
おかしくなっていたんでしょうか。。。。。)
報告し忘れていたのですが、select for updateを含むトランザクションがあや
しい挙動をします。
以下レポートです。
これをselect for updateで実行した場合、ロック元の処理が長い場合に、ロッ
ク待ちとなっているセッションが一定時間経過後にエラーを出力(ERROR:
replication server connection closed)して停止しますが、ロック元トランザ
クションが終了しても、ロックされていたテーブルにアクセスできなくなります。
ロック待ちセッションのトランザクションを終了してもエラーを出力して
(ERROR: current transaction is aborted, queries ignored until end of
transaction block)該当のテーブルにはアクセスできません。
(というか、トランザクションはアボートしてるんですが)
実際に行った内容は以下の通りです。
1.クラスタサーバ1のローカルからpsqlで接続し、以下のDMLを発行。(トラ
ンザクションは終了せずに放置)
begin;
select * from test where group_name = 'group_a' for update;
2.クラスタサーバ1のDML実行中に、クラスタサーバ2のローカルからpsqlで
接続し、以下のDMLを発行。
begin;
select * from test where group_name = 'group_a' for update;
しばらくすると(30秒くらい?)、ERROR: replication server connection
closedというエラーを出力して、制御が戻ってきます。
3.クラスタサーバ1のトランザクションを終了するため、以下のDMLを発行。
commit;
4.クラスタサーバ2でトランザクションを終了するため、以下のDMLを発行。
commit;
しばらくすると、ERROR: current transaction is aborted, queries ignored
until end of transaction blockというエラーを出力して、制御が戻ってきます。
5.クラスタサーバ2でtestテーブル(ロックがかかっていたテーブル)を検索
するため、以下のDMLを発行。
select * from test;
しばらくすると、ERROR: current transaction is aborted, queries ignored
until end of transaction blockというエラーを出力して、制御が戻ってきます。
この状態になると、該当のテーブルはそのセッションからアクセスできなくなり
ます。
begin;
lock table test in exclusive mode;
では発生しません。
#谷田様から提供されたパッチは当たっていない状態で検証しました。
#パラメータは初期値のままです。
pgcluster メーリングリストの案内