Postgres:如何注销Spring JPA创建的事务的锁



我有一个由Java Spring应用程序进行的操作,它会生成一个日志,如下所示,日志前有一个数字:是事务ID(%x(https://www.postgresql.org/docs/13/runtime-config-logging.html

2021-11-08 06:55:26.834 UTC [134] 0 LOG:  execute S_4: BEGIN
2021-11-08 06:55:26.836 UTC [134] 0 LOG:  execute <unnamed>: /* insert ENTITY1 */ 
RETURNING *
2021-11-08 06:55:26.881 UTC [134] 19573 LOG:  execute <unnamed>: /* insert ENTITY2 */ 
RETURNING *
2021-11-08 06:55:28.165 UTC [134] 19573 LOG:  execute <unnamed>: /* update ENTITY1 */
--Some more things--
2021-11-08 06:55:30.357 UTC [155] 0 LOG:  execute <unnamed>: BEGIN
2021-11-08 06:55:30.357 UTC [155] 0 LOG:  execute <unnamed>: 
RETURNING *
2021-11-08 06:55:30.400 UTC [155] 19576 LOG:  execute S_1: COMMIT
2021-11-08 06:55:30.452 UTC [134] 19573 LOG:  execute <unnamed>: /* update ENTITY1 */ update ...
2021-11-08 06:55:32.395 UTC [155] 0 LOG:  execute <unnamed>: BEGIN READ ONLY
2021-11-08 06:55:32.396 UTC [155] 0 LOG:  execute <unnamed>: select ...
2021-11-08 06:55:32.438 UTC [155] 0 LOG:  execute S_1: COMMIT
2021-11-08 06:55:32.564 UTC [155] 0 LOG:  execute S_2: BEGIN READ ONLY
2021-11-08 06:55:32.565 UTC [155] 0 LOG:  execute S_3: select ...
2021-11-08 06:55:32.606 UTC [155] 0 LOG:  execute S_1: COMMIT
2021-11-08 06:55:32.648 UTC [155] 0 LOG:  execute <unnamed>: select 
2021-11-08 06:55:32.864 UTC [134] 19573 LOG:  execute S_1: COMMIT

我看到由于某种原因,事务运行了很长时间(几秒钟(

我的问题:

  • 假设我只插入一个实体,并且总是用WHERE更新,这会导致表级锁定吗
  • 有没有一种方法可以让我从Postgres端或Java端注销,当这个操作获得了什么类型的锁,以及多长时间

假设我只插入单个实体,并始终使用在哪里,这会导致表级锁定?

如果在where列中使用的列上没有索引,则具有where原因的查询或更新可能需要时间。你也可以试着解释一下。

有没有办法从Postgres端或Java端注销此操作获取的锁的时间和类型-以及多长时间

由于您的代码看起来不像是显式地获取任何数据库锁,因此这些锁将在数据库引擎执行SQL期间隐式获取。Postgres提供了不同的视图来查询锁级别的信息。您可以参考本文档和官方文档进行不同的查询,以从Postgres端获取锁定信息。