【问题标题】:In a database with shared/exclusive locks, when an UPDATE statement is executed at the beginning of the transaction, how do the locks work?在具有共享/排他锁的数据库中,当在事务开始时执行 UPDATE 语句时,锁是如何工作的?
【发布时间】:2021-04-01 00:10:53
【问题描述】:

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

【问题讨论】:

标签: database postgresql concurrency locks


【解决方案1】:

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

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

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

所有这些is well documented

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-16
    • 2020-01-09
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    • 1970-01-01
    相关资源
    最近更新 更多