首页 > 解决方案 > 在具有共享/独占锁的数据库中,当在事务开始时执行 UPDATE 语句时,锁是如何工作的?

问题描述

在具有共享/独占锁的数据库中,当在事务开始时执行 UPDATE 语句时,锁是如何工作的?假设Repeatable Read或更高,它是在读取和搜索阶段获得共享锁,然后是排他锁,还是从一开始就获得排他锁?假设 Read Committed,UPDATE 语句是仅在写入阶段获得排他锁,还是在开始读取时立即获得?我正在使用 PostgreSQL。

标签: databasepostgresqlconcurrencylocks

解决方案


当 PostgreSQL 在表中扫描满足WHERE条件的行时UPDATE,它根本不会锁定行。仅当找到候选行时,才会将其锁定为EXCLUSIVE模式。如果锁不能立即获取,并且UPDATE被阻塞,PostgreSQL 会等待直到它可以获取锁,然后再次读取该行。行为取决于隔离级别:

  • READ COMMITTED如果最新的行版本仍然满足WHERE条件,它被锁定

  • 使用REPEATABLE READor SERIALIZABLE,如果行已更改,则会出现序列化错误,并且必须重试事务

这一切都有据可查


推荐阅读