Npgsql 3.2

时间:2017-03-14 11:11:04

标签: postgresql dapper npgsql

我使用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日志。

1 个答案:

答案 0 :(得分:0)

首先,Npgsql的自动准备功能是选择加入 - 如果没有连接字符串,它就不会被激活。即使这样,在Npgsql准备之前,需要多次执行相同的SQL(默认为5)。有关详细信息,请参阅the documentation

关于你的死锁,你是否同时运行你的代码?换句话说,您是否同时拥有多个事务,更新相同的行?如果是这样,那么这可能是预期的PostgreSQL行为,与Npgsql无关。更新事务中的行时,这些行将被锁定,直到提交事务为止。一般来说,修复是以相同的顺序更新行。 See the PostgreSQL documentation了解更多详情。