我使用Npgsql 3.2,似乎驱动程序现在正在自动编写语句。
我在PostgreSQL日志中看到以下内容:
LOG: execute <unnamed>:SELECT * FROM database.update_item($1, $2, $3 , $4)
我可能错了,但是在连接字符串上没有激活,我看不到之前的准备工作&#39;打电话给日志。
我错过了什么?
此外,我在Npgsql之上使用Dapper 1.50.2来查询数据库。 这个级别尚未实现,但我发现在GitHub上有一些关于此类功能的讨论。
我使用READ COMMITTED事务来更新数据库中的行。该行使用2个明确的语句更新两次。
在pgadmin查询窗口中逐个播放语句时,它可以正常工作。
当驱动程序通过执行语句播放语句时,第一个语句似乎将锁定放在记录上,第二个语句挂起。
以下是在查询窗口中运行的查询(运行完成):
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;
PostgreSQL在Npgsql播放时记录:
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
任何帮助表示感谢。
编辑1 :
其他信息:update_item()plpgsql函数正在使用EXECUTE语句更新行。
编辑2 :
为查询窗口添加了PG日志。
答案 0 :(得分:0)
首先,Npgsql的自动准备功能是选择加入 - 如果没有连接字符串,它就不会被激活。即使这样,在Npgsql准备之前,需要多次执行相同的SQL(默认为5)。有关详细信息,请参阅the documentation。
关于你的死锁,你是否同时运行你的代码?换句话说,您是否同时拥有多个事务,更新相同的行?如果是这样,那么这可能是预期的PostgreSQL行为,与Npgsql无关。更新事务中的行时,这些行将被锁定,直到提交事务为止。一般来说,修复是以相同的顺序更新行。 See the PostgreSQL documentation了解更多详情。