2017-03-14 1 views
0

私はNpgsql 3.2を使用しています。ドライバは現在、自動的に文を準備しているようです。私はPostgreSQLのログに次のように表示さNpgsql 3.2のPREPARE/EXECUTE

LOG: execute <unnamed>:SELECT * FROM database.update_item($1, $2, $3 , $4) 

私が間違っているかもしれないが、これは、接続文字列で起動し、私がログにコール「を用意」は、前を見ていないされていません。

私には何が欠けていますか?

また、Npgsqlの上でDapper 1.50.2を使用してデータベースにクエリしています。 これはまだこのレベルでは実装されていませんが、そのような機能については、GitHubにいくつかの話があります。

私はREAD COMMITTEDトランザクションを使用してデータベースの行を更新しています。行は2つの不明瞭なステートメントで2回更新されます。

pgadminのクエリウィンドウで1つずつステートメントを再生する場合、正常に動作します。

実行時にドライバによってステートメントが実行されると、最初のステートメントはレコードにロックを設定し、2番目のステートメントはハングします。

BEGIN; 

SET TRANSACTION ISOLATION LEVEL READ COMMITTED; 

SELECT * FROM database.update_item(params...); 

SELECT * from database.update_item(params...); 

ROLLBACK; 

対応するPGログ:

LOG: statement: BEGIN; 
LOG: statement: SET TRANSACTION ISOLATION LEVEL READ COMMITTED; 
LOG: statement: SELECT * FROM database.update_item(params...); 
LOG: statement: SELECT * from database.update_item(params...); 
LOG: statement: ROLLBACK; 

のNpgsqlで再生する場合、PostgreSQLはログに記録します。

LOG: statement: BEGIN 
LOG: statement: SET TRANSACTION ISOLATION LEVEL READ COMMITTED 
LOG: execute <unnamed>: select * from database.update_item(params...) 
LOG: execute <unnamed>: select * from database.update_item(params...) <-- hangs 
ここ

は、クエリがクエリウィンドウ(完了まで実行)で走っています

何かありがとうございました。

EDIT 1

追加情報:update_item()plpgsqlが機能EXECUTE文で行を更新しています。

EDIT 2:クエリウィンドウのための

追加PGのログ。

答えて

0

まず、Npgsqlの自動準備機能はオプトインです。接続文字列なしでは有効になりません。それでも、Npgsqlが準備する前に同じSQLを数回(デフォルトでは5回)実行する必要があります。詳細は、the documentationを参照してください。

デッドロックに関して、コードを同時に実行していますか?つまり、同じ行を更新しながら、同時に複数のトランザクションを実行していますか?もしそうなら、これはおそらくPostgreSQLの予想される動作であり、Npgsqlとは関係ありません。トランザクションの行を更新すると、トランザクションがコミットされるまでこれらの行がロックされます。一般的な修正は、同じ順序で行を更新することです。詳細についてはSee the PostgreSQL documentationを参照してください。

+0

''を実行してNpgsqlを実行するとどうなりますか?いいえ、同時トランザクションはありません。 –

+0

私が間違っていない限り、それは単にNpgsqlによって文が準備されていないことを意味します。デッドロックとあなたの質問の準備の関係を理解するのはちょっと難しいです(そして、そこにあるべきではありません)。準備に関係なくデッドロックが起こっていることを確認できますか?デッドロックは常に発生するのですか、それとも時折起こりますか?最後に、完全なコードサンプル(関数を含む)が問題を再現するのに役立ちます。 –

+0

デッドロックは、クエリが1つずつ実行されるpgadminクエリウィンドウからは発生しません。 pglog as文にはログインしています。クエリが同じ接続上のNpgsqlから実行されるたびに発生します。実行はと記録されています。それらはただの事実です。私はあなたに同意します、準備はおそらくロックを混乱させるべきではありません。私は手がかりを探しています。 –