Postgres ShareRowExclusiveLock锁定

时间:2011-03-17 16:33:25

标签: postgresql configuration deadlock

我有一个装载posgres服务器,有大量的更新操作。在postgres.conf中我设置了deadlock_timeout = 8s。

在日志中,我看到以下内容:

过程3588在数据库16392的关系17360之后获取ShareRowExclusiveLock 8000.000毫秒

这似乎很慢。你对这个有什么看法? deadlock_timeout有更好的价值吗?还有哪些其他设置可以帮助缩短锁定时间?日志中的这一行表示交易已经中断,任何数据都没有更新?

感谢您的帮助!

阿尔乔姆

2 个答案:

答案 0 :(得分:1)

你读过这个吗?

http://www.postgresql.org/docs/current/static/runtime-config-locks.html

  

理想情况下,设置应该超过典型的交易时间,以便在服务员决定检查死锁之前提高锁定释放的几率。

答案 1 :(得分:1)

当您明确发出LOCK TABLE声明时,会获取ShareRowExclusiveLocks。 LOCK TABLE的默认行为是请求对表的独占访问:在释放锁之前,任何人都无法从中读取。

PostgreSQL使用多版本并发控制来处理数据库中的事务完整性。除非您发现应用程序出现问题,否则我建议您关闭明确使用LOCK TABLE或尝试在数小时后运行批量更新操作。

如果您确实需要使用显式锁定,我还建议您查看Explicit Locks文档。