私は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のログ。
''を実行してNpgsqlを実行するとどうなりますか?いいえ、同時トランザクションはありません。 –
私が間違っていない限り、それは単にNpgsqlによって文が準備されていないことを意味します。デッドロックとあなたの質問の準備の関係を理解するのはちょっと難しいです(そして、そこにあるべきではありません)。準備に関係なくデッドロックが起こっていることを確認できますか?デッドロックは常に発生するのですか、それとも時折起こりますか?最後に、完全なコードサンプル(関数を含む)が問題を再現するのに役立ちます。 –
デッドロックは、クエリが1つずつ実行されるpgadminクエリウィンドウからは発生しません。 pglog as文にはログインしています。クエリが同じ接続上のNpgsqlから実行されるたびに発生します。実行はと記録されています。それらはただの事実です。私はあなたに同意します、準備はおそらくロックを混乱させるべきではありません。私は手がかりを探しています。 –