PostgreSQL同一事务中已锁行能否被本事务内其他操作访问?
同一事务内重复更新同一行的锁机制问题
你给出的事务执行流程代码如下:
BEGIN -- txID: 1234 UPDATE tbl_1 SET field = value WHERE id IN (1); -- 为简化示例 -- 获取ID为1的行的锁 UPDATE tbl_1 SET field = new_value WHERE id IN (1); -- 仅为测试再次更新同一行 -- 该操作是否仍需等待前一操作的锁? COMMIT -- txID: 1234 -- 释放ID为1的行的锁
针对你的问题,答案很明确:
- 第二个
UPDATE操作不需要等待前一操作的锁,可以直接执行。
原因在于数据库锁的设计逻辑:锁的核心作用是隔离不同事务之间的并发操作,避免数据冲突。而同一事务内的所有操作属于同一个上下文,数据库能够识别出后续操作来自持有锁的同一个事务,因此会直接允许该操作复用已持有的锁,无需触发锁等待或阻塞逻辑。
在这个场景中,第一个UPDATE获取id=1行的排他锁后,该锁会被当前事务持续持有直到COMMIT,但同一事务内的后续更新操作无需重新申请锁,直接基于已持有的锁完成数据修改即可。
内容的提问来源于stack exchange,提问作者Azima
相关产品推荐
相关产品推荐

