我的应用程序测试对数据库非常困难。它们运行create,drop和alter table语句。但是,我仍然期望postresql即使在死锁的情况下也能处理这些问题(即检测锁定并将一个线程删除)。我也没有同时运行请求。
然而,在我的情况下,它只是冻结,我必须手动手动杀死它们(如果我改变了稍微运行的顺序,它可以工作,但这不会给我信心)。这些锁表明create table语句有一个独占锁,一个事务也有一个。
有没有人经历过类似的事情?有没有可以提供帮助的服务器设置?或者只是任何建议?
答案 0 :(得分:7)
PostgreSQL会自动检测死锁。最有可能的是,你只是在一些尚未完成的声明中阻止。只有当两个语句相互等待时才会出现死锁。
如果你检查你的“锁树”到根(d阻塞b阻塞在a上有一个根),你很可能会找到一个需要很长时间才能运行的事务,或者那个没有正确提交但只是处于“闲置交易”模式。
因为你提到了线程 - 请注意所有客户端库在客户端都不一定是线程安全的。