Postgresql 在Npgsql 3.2中准备/执行

Postgresql 在Npgsql 3.2中准备/执行,postgresql,dapper,npgsql,Postgresql,Dapper,Npgsql,我使用的是Npgsql 3.2,驱动程序现在似乎正在自动准备语句 我在PostgreSQL日志中看到以下内容: LOG: execute <unnamed>:SELECT * FROM database.update_item($1, $2, $3 , $4) 相应的PG日志: LOG: statement: BEGIN; LOG: statement: SET TRANSACTION ISOLATION LEVEL READ COMMITTED; LOG: statement:

我使用的是Npgsql 3.2,驱动程序现在似乎正在自动准备语句

我在PostgreSQL日志中看到以下内容:

LOG: execute <unnamed>:SELECT * FROM database.update_item($1, $2, $3 , $4)
相应的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
日志:语句:开始 日志:语句:设置事务隔离级别读取已提交 日志:执行:从数据库中选择*更新项目(参数…)
LOG:execute:select*from database.update_item(params…)首先,Npgsql的自动准备功能是opt-in-如果没有连接字符串,它不会被激活。即使如此,在Npgsql准备之前,同样的SQL也需要执行多次(默认情况下为5次)。有关更多详细信息,请参阅


关于死锁,您是否同时运行代码?换句话说,您是否同时有多个事务,更新相同的行?如果是这样,那么这可能是预期的PostgreSQL行为,与Npgsql无关。更新事务中的行时,这些行将被锁定,直到提交事务为止。通常的修复方法是以相同的顺序更新行。有关更多详细信息。

如何通过Npgsql执行?不,没有并发事务。除非我弄错了,否则这仅仅意味着Npgsql尚未准备好该语句。在你的问题中,要理解死锁和准备工作之间的关系有点困难(而且不应该是开着的)——你能确认死锁是在不考虑准备工作的情况下发生的吗?僵局总是发生,还是偶尔发生?最后,完整的代码示例(包括函数)将有助于重现该问题。死锁不会在pgadmin查询窗口中发生,在该窗口中,查询会逐个运行。pglog as语句中有个已登录。每次在同一连接上从Npgsql运行查询时都会发生这种情况。有记录为“执行”。这些只是事实。我同意你的观点,准备工作可能不会弄乱锁。我在寻找线索。当从pgadmin运行它们时,您是否也有正在进行的事务?另外,您可以在postgresql.conf中打开语句日志记录并发布结果吗?抱歉,没有看到您已经发布了结果-似乎您甚至与pgadmin有一个事务。你也可以发布那次跑步的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