2011年6月28日

[pgsql-jp: 40826]デッドロックについて

お世話になります。野沢と申します。

デッドロックの現象が解決しないため、質問させてください。
RHEL5.5 64bit,Postgresql8.4.5

○質問事項
レコード件数が少ないテーブルに対して複数トランザクションで
Update文を発行する場合、デッドロックが発生することは

ありえますでしょうか。
また、解析方法で有効な手段があればご教授お願いできないでしょうか。

○現象
<SQLについて>
下記(1)、(2)の順でSQLが発行されます。
(1)SQL1
SELECT カラムA、カラムB、カラムc
FROM 業務テーブルA
FOR UPDATE;

(2)SQL2
UPDATE 業務テーブルA
SET カラムC = SQL(1)で取得した値
WHERE カラムA = カラムAの値
AND カラムB = カラムBの値

<業務テーブルA>
合計4レコードのみ

<デッドロックが発生した時の状況>
(1)SQL発行頻度
  テストでは80TPSの負荷をかけて、上記SQL文を発行しました。

(2)deadlock_timeoutの設定
  当初はデフォルト設定(1秒)を設定しており、直ぐにデッドロックタイムアウトが返却されました。
  SQLコード:40P01(デッドロックの検出)
  デッドロック回避のために、当設定値がチューニング要と判断し、設定値を(100秒)に変更して、再実行しました。
  が、100秒後にデットロックタイムアウトが検出されました。
  deadlock_timeout の値を増やす事で、デッドロックタイムアウトの回避は出来ず、
  検知にかかる時間が大きくなるという結果でした。
  数秒間実施で356/9500件の割合(3.7%)でデッドロックを検出しています。

(3) 襷掛け確認
  単一のテーブルの更新に対してのトランザクションの集中であり、
  複数トランザクションによる、ロック解放待ちの襷掛け状態にはなっておりませんでした。

(4)Postgresqlログ
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: deadlock detected
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: Process 8518 waits for ExclusiveLock on tuple (23,59) of relation 16407 of database 16384; blocked by process 8838.
Process 8838 waits for ShareLock on transaction 279656; blocked by process 8443.
Process 8443 waits for ShareLock on transaction 279657; blocked by process 8284.
Process 8284 waits for ExclusiveLock on tuple (23,59) of relation 16407 of database 16384; blocked by process 8518.
Process 8518: SQL1
Process 8838: SQL1
Process 8443: SQL1
Process 8284: SQL1


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

投稿者 xml-rpc : 2011年6月28日 18:03
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/105080
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。