Postgres 9.6.5通过c#应用程序访问作为注释,以防由于某些原因与ado.net相关。
我制作了一个测试应用来重新创建场景。它正在同时对表执行相同的Select查询。虽然每次都可以在不同的时间点重新发生相同的锁定场景,导致作业挂起并最终在后台出现某种错误。
以下是正在运行的查询,Vehicle表大约有超过100万条记录:
select id, vin from vehicle;
我在10个并发线程中运行10次,共执行100次。执行时,服务监视器看起来像这样。
我也尝试过使用FOR SHARE:
select id, vin from vehicle FOR SHARE;
这似乎有助于减少工作剩余的时间,但它们仍然处于锁定状态:
我很难理解为什么多个SELECT ONLY查询无法同时在同一个表上执行,而这些查询没有被修改,而不会导致锁定?
对于记录,这发生在我们使用过滤条件的其他表上,例如“选择所有经销商ID = x的客户”。这使得postgres看起来不能支持表上的多个并发查询。因为它被广泛使用,我觉得很难相信。
答案 0 :(得分:1)
那些不是行锁或表锁。每笔交易都会自行锁定。或许我读过的最清楚的解释就是
http://rhaas.blogspot.co.uk/2011/10/deadlocks.html?m=1
当然,你没有看到任何僵局,但是当他们在应用中遇到问题时,人们通常会对锁定感兴趣。