-postgres db throws max_pred_locks_per_per_transaction超过

问题描述 投票:0回答:1
我们使用Azure PostgreSQL灵活服务器DB进行我们的性能测试。在大约50 tps的最大负载上,我们所有的查询都在失败的情况下失败。

[ERROR: out of shared memory Hint: You might need to increase max_pred_locks_per_transaction.] [n/a].

我执行了以下查询,以获取有关Postgres锁定的一些见解。
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

锁。这些锁不会阻止任何东西,但它们实现了

锁锁
,用于检查潜在的交易

java postgresql spring-boot hibernate isolation-level
1个回答
0
投票
max_pred_locks_per_transaction

以在锁桌上有足够的谓词锁的空间并不少见。

如果您不想要
SERIALIZABLE
,您必须弄清楚设置的位置并更改它。那么您的应用程序将使用较少的锁。
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.