我有一个由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端获取锁定信息。