数据库中有表X和表的,BN,CN,DN,从X.订单查询(PostgreSQL的)锁
过程1个查询周期性地从X.
数据过程2继承的更新子表中的数据。例如,要更新表An和Bn,它会创建新的表Am和Bm,将数据加载到它们中,锁定访问专用An,Bn,并将An和Bn放入并更改Am和Bm以继承X.
问题是当进程1执行查询时(例如select * from X
)它以共享模式锁定表An,Bn,Cn,Dn,并且锁定顺序未知。如果进程1锁定了Bn,那么进程2锁定我们有死锁。
有没有关于在postgresql查询锁定表的顺序(没有显式锁定)?或者可能有其他解决方案是可能的?
SELECT不锁定表格,除非您明确要求锁定。你有没有检查pg_locks来看看发生了什么? http://www.postgresql.org/docs/8.4/interactive/view-pg-locks.html – 2010-06-28 06:28:01
SELECT锁表(http://www.postgresql.org/docs/8.1/static/explicit-locking.html) ,并在我的情况下,它与专门请求删除的访问冲突。 访问共享 仅与ACCESS EXCLUSIVE锁定模式冲突。 SELECT和ANALYZE命令在引用的表上获取此模式的锁定。一般来说,任何只读取一个表并且不修改它的查询都会获得这种锁定模式。 – valodzka 2010-06-28 09:21:15
它因为ACCESS EXCLUSIVE而发生冲突,那就是你的问题。 SELECT本身不是问题。 – 2010-06-28 11:08:14