在我的webapp上,一些查询运行3分钟(我知道,这是巨大的......)。 同时,另一个用户尝试更新同一个表中的数据。 似乎更新查询等待选择运行结束。
它是PostgreSQL的标准操作方式吗?有没有办法在选择查询结束之前强制执行更新?
感谢。
答案 0 :(得分:1)
您无法禁用MVCC,因此这不是问题。 MVCC引用行存储在磁盘上的方式,避免低锁定。
在尝试了解如何以及何时需要锁定PostgreSQL时,您应该了解MVCC。通常读者不会阻止读者或作者。作家很少阻止读者。
读者和作者通常可以通过处理在语句或事务的生命周期内相当稳定的快照来避免相互阻塞(确切的稳定性取决于事务级别)。
仍然可以进行行锁定,但必须明确要求。 SELECT ... FOR UPDATE
将锁定为其选择的行。因此,首先要做的是检查并查看SELECT
语句是否有for update
谓词。
如果不是这样,那么检查隔离级别并尝试在read committed
隔离级别下运行
除此之外,请检查pg_locks表并查看实际锁定的内容。