PostgreSQLの謎のデッドロックに苦しんでいます。
PHP Warning: pg_q> uery(): Query failed: ERROR: デッドロックを検出しました
DETAIL: プロセス 8100 は ShareLock を トランザクション 624517 で待機していましたが、プロセス 6032 でブロックされました
プロセス 6032 は ShareLock を トランザクション 624508 で待機していましたが、プロセス 8100 でブロックされました
HINT: クエリーの詳細はサーバログを参照してください in pg_load_test.php on line *
これがなぜ出てしまうのか、推測でも結構ですのでどなたか理由と解決策を教えてください。
エラーを再現できるスクリプトは以下です。
lang
1<?php 2$dbh = pg_connect("host=localhost port=5432 dbname=postgres user=postgres"); 3while(1){ 4 $res = pg_query($dbh, "UPDATE public.table SET created = NOW() WHERE field = '*****'"); 5 if(!$res) exit(); 6} 7
条件句のfieldはINDEXが貼ってあり、複数列がHITします。
サンプルは無限ループですが、実際のバッチも数百万レコードを嘗めてUPDATEに向かいます。
このバッチは中身は一緒で並列稼働します。
最低2本の並列で事象が出ますが、実運用は7並列で稼働しています。
並列数が増えれば増えるほど、当たり前かもしれませんが、デッドロックの検出タイミングは早まります。
クライアント
Windws7
PHP5.6
サーバ
PostgreSQL9.3.5
CentOS6.5 or Windows7 (どちらでも発生を確認)
よろしくお願いします。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2014/11/20 13:29
2014/11/21 00:09
2014/11/21 00:23
2014/11/21 00:59
2014/11/21 01:20
2014/11/21 01:52
2014/11/21 02:07