我有多个工作进程读取数据并将其插入同一个 postgresql 数据库。但有时,似乎什么都没有发生。难道是一个进程的选择或插入可能会阻塞/锁定另一个进程的插入或选择?
问问题
2252 次
2 回答
3
除非您使用,否则LOCK TABLE .. EXCLUSIVE
无法阻止SELECT
Postgres 中的语句。
INSERT
然而,另一个尝试插入相同主键值的事务可能会阻止一个。
如果您遇到“似乎什么都没有发生”的情况,您可以查询pg_stat_activity
并检查该waiting
列以查看是否有任何连接被阻止。
于 2013-01-16T15:10:27.717 回答
2
这个问题没有具体细节,但是是的,作家很可能会阻止其他作家。在多工人场景中,这是您在设计代码时需要担心的事情之一。
诸如写入另一个会话已写入但尚未提交的行之类的常见操作将在默认隔离模式下阻塞。插入具有唯一索引的表也将阻塞,直到另一个执行相同操作的会话尚未提交或回滚。
让交易尽可能短的时间可以缓解这个问题。如果您需要对大型表进行计数(*),请不要这样做,而是使用预先计算的计数器(请参阅Slow_Counting)。
要在问题发生时检查锁,请参阅Lock_Monitoring中的查询。
于 2013-01-16T15:22:26.403 回答