Npgsql 3.2를 사용하고 있는데 드라이버가 자동으로 명령문을 준비하고있는 것 같습니다.Npgsql 3.2의 PREPARE/EXECUTE
은 내가 PostgreSQL의 로그에 다음을 참조하십시오
LOG: execute <unnamed>:SELECT * FROM database.update_item($1, $2, $3 , $4)
내가 틀렸을 수도 있지만이 연결 문자열에 활성화되지 않고 나는 더 이전 '준비'로그에 전화를 볼 수 없습니다.
무엇이 누락 되었습니까?
또한 데이터베이스를 쿼리하기 위해 Npgsql 상단에 Dapper 1.50.2를 사용하고 있습니다. 아직이 레벨에서는 구현되지 않았지만 GitHub에 그러한 기능에 대한 일부 대화가 있습니다.
데이터베이스의 행을 업데이트하기 위해 READ COMMITTED 트랜잭션을 사용하고 있습니다. 행은 2 개의 불연속 문으로 두 번 업데이트됩니다.
pgadmin 쿼리 창에서 명령문을 하나씩 재생할 때 제대로 작동합니다.
실행자가 드라이버를 통해 명령문을 재생하면 첫 번째 명령문은 레코드에 잠금을 설정하고 두 번째 명령문은 중지됩니다. Npgsql 연주 할 때
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;
PostgreSQL의 로그 :
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: execute <unnamed>: select * from database.update_item(params...)
LOG: execute <unnamed>: select * from database.update_item(params...) <-- hangs
도움을 주시면 감사하겠습니다.
EDIT 1 :
추가 정보 : update_item() plpgsql 함수는 EXECUTE 문 행을 업데이트한다.
편집 2 : 쿼리 창에 대한
추가 PG 로그.
Npgsql을 통해 ' 실행'은 어떻게됩니까? 아니오, 동시 트랜잭션이 없습니다. –
내가 잘못하지 않는 한, 그것은 단순히 Npgsql에 의해 아직 성명서가 준비되지 않았 음을 의미합니다.교착 상태와 준비 사이의 관계를 이해하는 것은 약간 어렵습니다. (교착 상태가 발생해서는 안됩니다) 교착 상태가 준비에 관계없이 발생했는지 확인할 수 있습니까? 교착 상태가 항상 발생합니까, 아니면 가끔 발생합니까? 마지막으로 전체 코드 샘플 (함수 포함)을 사용하면 문제를 재현하는 데 도움이됩니다. –
쿼리가 하나씩 실행되는 pgadmin 쿼리 창에서 교착 상태가 발생하지 않습니다. pglog as 명령문에 기록됩니다. 쿼리가 동일한 연결에서 Npgsql에서 실행될 때마다 발생합니다. 실행은으로 기록됩니다. 그것은 단지 사실입니다. 나는 당신과 동의한다, 준비는 자물쇠로 어지럽히 지 않아야한다. 나는 단서를 찾고있다. –