Postgres为什么同一个表上的并发选择导致独占锁?

时间:2018-01-31 17:46:36

标签: c# postgresql

Postgres 9.6.5通过c#应用程序访问作为注释,以防由于某些原因与ado.net相关。

  1. 为什么在表上同时运行一个简单的SELECT语句会导致锁定?
  2. 为什么以上似乎只是有时导致1或2个相同的工作无限期挂起?
  3. 在不引起锁定或至少是独占锁定的情况下并发查询表的适当方法是什么?
  4. 我制作了一个测试应用来重新创建场景。它正在同时对表执行相同的Select查询。虽然每次都可以在不同的时间点重新发生相同的锁定场景,导致作业挂起并最终在后台出现某种错误。

    以下是正在运行的查询,Vehicle表大约有超过100万条记录:

    select id, vin from vehicle;
    

    我在10个并发线程中运行10次,共执行100次。执行时,服务监视器看起来像这样。 enter image description here

    我也尝试过使用FOR SHARE:

    select id, vin from vehicle FOR SHARE;
    

    这似乎有助于减少工作剩余的时间,但它们仍然处于锁定状态:

    enter image description here

    我很难理解为什么多个SELECT ONLY查询无法同时在同一个表上执行,而这些查询没有被修改,而不会导致锁定?

    对于记录,这发生在我们使用过滤条件的其他表上,例如“选择所有经销商ID = x的客户”。这使得postgres看起来不能支持表上的多个并发查询。因为它被广泛使用,我觉得很难相信。

    当它出现错误时,即使有任何错误处理,我们也完全没有任何信息。该应用程序只是进入“休息模式”。 enter image description here

1 个答案:

答案 0 :(得分:1)

那些不是行锁或表锁。每笔交易都会自行锁定。或许我读过的最清楚的解释就是

http://rhaas.blogspot.co.uk/2011/10/deadlocks.html?m=1

当然,你没有看到任何僵局,但是当他们在应用中遇到问题时,人们通常会对锁定感兴趣。