2017-03-14 20 views
0

我使用的是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日志查询窗口。

回答

0

首先,Npgsql的自动准备功能是opt-in - 它没有激活连接字符串。即使如此,在Npgsql准备好之前,需要多次执行相同的SQL(默认为5)。有关更多详细信息,请参阅the documentation

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

+0

怎么样的Npgsql的通过 '执行'?不,没有并发交易。 –

+0

除非我误解了,这只是表示该语句尚未由Npgsql编写。理解僵局和准备问题之间的关系有点困难(并且不应该出现) - 请确认无论准备情况如何,僵局都会发生?僵局总是会发生,还是偶尔发生?最后,一个完整的代码示例(包括函数)将有助于重现此问题。 –

+0

从pgadmin查询窗口中不会发生死锁,其中查询逐个运行。有声明登录pglog。每次在同一连接上从Npgsql运行查询时,都会发生这种情况。有记录为执行。那些只是事实。我同意你的看法,准备应该不会弄乱锁定。我正在寻找线索。 –