[ERROR: out of shared memory Hint: You might need to increase max_pred_locks_per_transaction.] [n/a].
SELECT * FROM pg_locks pl LEFT JOIN pg_stat_activity psa
ON pl.pid = psa.pid
left join pg_catalog.pg_class pc
on pl.relation = pc."oid";
上述查询的解析
从上面的结果,请注意PG_LOCKS表具有超过57K+记录。其中大多数具有
sireadlock。您的代码库具有许多复杂的查询,并具有多个加入(不是以最佳方式编写)。另外,我也看到以下一些例外:
Hibernate transaction: Unable to commit against JDBC Connection; ERROR: could not serialize access due to read/write dependencies among transactions
Detail: Reason code: Canceled on commit attempt with conflict in from prepared pivot.
Hint: The transaction might succeed if retried.
我想了解这个问题的根源。我相信这是由于长期运行的查询占用桌子上的锁以及其他等待锁定锁的交易而发生的。如果有人可以帮助我理解sireadlocks以及为什么要详细介绍上述例外,那真的很有帮助。预先感谢
您已经配置了数据库或应用程序以使用SERIALIZABLE
事务隔离级别。只有这样,您才会看到
SIReadLock
锁。这些锁不会阻止任何东西,但它们实现了
锁锁,用于检查潜在的交易。
max_pred_locks_per_transaction
以在锁桌上有足够的谓词锁的空间并不少见。
如果您不想要
SERIALIZABLE
,您必须弄清楚设置的位置并更改它。那么您的应用程序将使用较少的锁。