[pgsql-jp: 40600] Re: トランザクションの結果反映遅延についてご質問

Hiroshi Inoue inoue @ tpf.co.jp
2010年 12月 8日 (水) 12:44:28 JST


井上です。

(2010/12/07 11:59), toshihideka4316 @ zenrin.co.jp wrote:
> お世話になります、片山です。
> 
>> サーバー側でログを取って調べられた方が事情がはっきりするのではないでしょう
> か?
> 遅くなりましたが、本件につきましてサーバログを収集しました。
> サーババージョン8.2.14ではログのメッセージ部分が文字化けして読めませんでし
> た。
> そこでサーババージョン8.4.2で試したところ、現象が再現しましたので8.4.2のログ
> を収集しました。
> (クライアントは8.2.14のままです)
> ログは以下の通りです。

強制切断した際に何故コミットが反映されるのかはよくわかりませんが、Out
of memoryになった際のドライバの処理が中途半端なのは確かです。ちょこ
ちょこと修正したものを
 http://www.ne.jp/asahi/inocchichichi/entrance/psqlodbc/indexj.html
に置きました。9.0.0201ではなく9.0.0202に向けて確認テスト中のドライバを
お試しください。

> ↓############
> LOG:  接続を受け付けました: ホスト=XX.XX.XX.XX port=3073
> LOG:  接続の認証を行いました: ユーザ=testUser、データベース=TESTDB
> STATEMENT:  BEGIN;update TEST set col = 'テスト2' where TESTCODE = 21433
> LOG:  クライアントにデータを送信できませんでした: 接続が相手からリセットされ
> ました
> STATEMENT:  select * from TEST
> LOG:  クライアントにデータを送信できませんでした: パイプが切断されました
> STATEMENT:  select * from TEST
> WARNING:  進行中のトランザクションがありません
> WARNING:  進行中のトランザクションがありません
> ↑############
> 
> 張り付いてログを監視したこところ、処理の流れとログの流れは以下の通りでした。
> 括弧内が処理です。
> 
> (接続)
> LOG:  接続を受け付けました: ホスト=XX.XX.XX.XX port=3073
> LOG:  接続の認証を行いました: ユーザ=testUser、データベース=TESTDB
> (トランザクション開始)
> (Update文発行)
> (select文にてout of memory)
> (コミット)
> (接続の切断)
> STATEMENT:  BEGIN;update TEST set col = 'テスト2' where TESTCODE = 21433
> LOG:  クライアントにデータを送信できませんでした: 接続が相手からリセットされ
> ました
> STATEMENT:  select * from TEST
> LOG:  クライアントにデータを送信できませんでした: パイプが切断されました
> STATEMENT:  select * from TEST
> (接続を切断してから1分後くらい)
> WARNING:  進行中のトランザクションがありません
> WARNING:  進行中のトランザクションがありません
> 
> ################################################
> 動作再現は以下のフリーソフトで行っています。
> ↓黒猫 SQL Studio
> <http://kuronekosoft.ewinds.net/sqlstudio.aspx>
> 
> ■環境
> PostgreSQL ver8.2.14(サーバ、クライアント共に)、ODBC接続(ODBCドライバ ver8.
> 2.14)、
> DeclareFetch=0、クライアントカーソル使用
> ⇒サーバver8.4.2でも現象が再現した
> 
> ■トランザクションの結果反映に遅延が生じるパターン
>  1)接続、トランザクション開始
>  2)Update文を発行してレコードを変更
>  3)select文にて大容量のデータを取得した結果「out of memory」となった
>  4)コミット
>  5)接続の切断
>  6)切断直後に別接続でSelect文を発行⇒更新内容が反映されていない
>  7)接続を切断してから約1分後更新内容が反映された⇒トランザクションの結果が
> 遅延して反映されている
> ⇒5)にてコミット後に接続を切断しない場合、コミットを行ってから20分たってもト
> ランザクションの結果が反映されない
> 
> 以上よろしくお願いいたします。



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