在我的 web 应用程序上,一些查询运行 3 分钟(我知道,它很大......)。同时另一个用户尝试从同一个表中更新数据。似乎更新查询等待选择运行结束。
它是 PostgreSQL 的标准操作方式吗?有没有办法在选择查询结束之前强制执行更新?
谢谢。
在我的 web 应用程序上,一些查询运行 3 分钟(我知道,它很大......)。同时另一个用户尝试从同一个表中更新数据。似乎更新查询等待选择运行结束。
它是 PostgreSQL 的标准操作方式吗?有没有办法在选择查询结束之前强制执行更新?
谢谢。
您不能禁用 MVCC,所以这不是问题。MVCC 指的是行存储在磁盘上的方式,并且避免了低锁定。
在尝试了解 PostgreSQL 锁定的方式和时间可能是必要的时,您应该了解 MVCC。通常读者不会阻止读者或作者。作家很少屏蔽读者。
读取器和写入器通常可以通过处理在语句或事务的生命周期内相当稳定的快照来避免相互阻塞(确切的稳定性取决于事务级别)。
行锁定仍然是可能的,但必须明确要求。 SELECT ... FOR UPDATE
将锁定选定的行。所以首先要做的是检查SELECT
语句是否有for update
谓词。
如果不是这种情况,则检查隔离级别并尝试在read committed
隔离级别下运行
除此之外,检查 pg_locks 表并查看实际被锁定的内容。