2009-07-20 12 views
3

私のアプリケーションのテストはデータベース上でかなり難しいです。彼らはテーブルステートメントの作成、削除、および変更を実行します。しかし、デッドロックの場合でも(つまり、ロックを検出して1つのスレッドを取り除く)、postresqlがこれらを処理するとは思っています。私は同時に要求を実行していません。PostgreSQLの排他ロックがアプリケーションを停止します

しかし、私の場合、それはちょうど凍結し、私は手作業でそれらを手動で消さなければなりません(私は少し走った順番を変えても動作しますが、これは私に自信を与えません)。ロックは、create tableステートメントに排他ロックが設定され、トランザクションにもロックが設定されていることを示しています。

誰も同様の経験がありますか?助けることができるサーバー設定はありますか?またはちょうど任意の助言?

答えて

7

PostgreSQLは自動的にデッドロックを検出します。ほとんどの場合、終了していない文章ではブロックしているだけです。デッドロックは、2つのステートメントがお互いを待っている場合にのみ発生します。

"ロックツリー"をルートまで調べると(ルート上にaがある場合はbブロックがブロックされます)、実行に時間がかかっているか、正しくコミットされていませんが、単に「アイドル・イン・トランザクション」モードになっています。

スレッドに言及しているので、すべてのクライアントライブラリが必ずクライアント側でスレッドセーフである必要はありません。

+1

ありがとうございました。トランザクションのアイドル状態だった、http://wiki.dspace.org/index.php/Idle_In_Transaction_Problemは、トランザクションを引き起こしたものをデバッグするのに役立ちました。でも、まだ100%ではないと確信しています。 –