database - 在具有共享/独占锁的数据库中,当在事务开始时执行 UPDATE 语句时,锁是如何工作的?
问题描述
在具有共享/独占锁的数据库中,当在事务开始时执行 UPDATE 语句时,锁是如何工作的?假设Repeatable Read或更高,它是在读取和搜索阶段获得共享锁,然后是排他锁,还是从一开始就获得排他锁?假设 Read Committed,UPDATE 语句是仅在写入阶段获得排他锁,还是在开始读取时立即获得?我正在使用 PostgreSQL。
解决方案
当 PostgreSQL 在表中扫描满足WHERE
条件的行时UPDATE
,它根本不会锁定行。仅当找到候选行时,才会将其锁定为EXCLUSIVE
模式。如果锁不能立即获取,并且UPDATE
被阻塞,PostgreSQL 会等待直到它可以获取锁,然后再次读取该行。行为取决于隔离级别:
,
READ COMMITTED
如果最新的行版本仍然满足WHERE
条件,它被锁定使用
REPEATABLE READ
orSERIALIZABLE
,如果行已更改,则会出现序列化错误,并且必须重试事务
这一切都有据可查。
推荐阅读
- c++ - 如何在 C++ 中制作十进制随机数生成器?
- symfony - 如何使用 TerserPlugin 和 webpack-encore 进行缩小
- c++ - C++ g_signal_connect实现gtkmm,返回警告
- javascript - 跟踪由 react-window 渲染的项目的可见性
- excel - 如何从单元格中提取字符串中的前两个字符并打印到另一个单元格
- c# - 如何进行多个异步调用并从找到匹配记录的第一个调用返回数据然后停止剩余的异步调用
- c# - 在接受不同数量参数的单独类中重构存储过程方法
- sql - 如何计算所有不同的行?
- python - if、elif、else 条件
- python - 在数据帧行上迭代 for 循环