我使用的是3.2 Npgsql的,似乎是司机,现已自动准备语句。准备/执行中3.2 Npgsql的
我看到在PostgreSQL的日志中的以下内容:
LOG: execute <unnamed>:SELECT * FROM database.update_item($1, $2, $3 , $4)
我可能是错的,但是这不是在连接字符串启动,我看不出之前的“准备”在日志中调用。
我缺少什么?
另外我在Npgsql之上使用Dapper 1.50.2来查询数据库。 这还没有在这个级别实现,但我看到GitHub上有一些关于这种功能的讨论。
我使用的是READ提交的事务来更新数据库中的一行。该行使用2个不同的语句更新两次。
在pgadmin查询窗口中逐个播放语句时,它可以正常工作。
当驱动程序通过execute执行语句时,第一条语句似乎将锁定在记录上,第二条语句挂起。
这里是在查询窗口中的查询跑(运行到完成):当由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。每次在同一连接上从Npgsql运行查询时,都会发生这种情况。有记录为执行。那些只是事实。我同意你的看法,准备应该不会弄乱锁定。我正在寻找线索。 –