mysql - 为什么没有在 MySQL 中锁定 READ COMMITTED
问题描述
我在我的 Windows 机器上使用 MySQL 8。试图查看 READ COMMITTED 隔离级别。
innodb_lock_wait_timeout = 5;
innodb_rollback_on_timeout =1;
T1: start transaction;
update todo set title='RC' where id=1;
T2;
start transaction;
set session transaction isolation level read committed;
select title from todo where id=1;
got output
根据我的理解,T1 对 id=1 有写锁,T2 不应该得到输出。T2 应该得到锁超时异常。
为什么 T2 没有获得锁定超时并获得提交的结果?
如何获得锁定超时?
解决方案
T2 正在运行非锁定SELECT 语句。它不需要等待 T1 持有的锁,因为 T2 可以读取在 T2 开始事务发生时提交的行版本。
如果您运行锁定SELECT 语句,则需要等待 T1 持有的锁。
SELECT title FROM todo WHERE id=1 FOR UPDATE;
无论您使用事务隔离级别 READ COMMITTED 还是 REPEATABLE READ,上述两种解释都是正确的。
推荐阅读
- java - Java:组件 Z 顺序问题。组件返回到其他组件
- sql - 如何根据特定条件拆分列
- weka - 这个错误在 WEKA 测试集的预测中意味着什么
- python - 删除文件python的空格
- php - 错误消息:“Property App\Aurora\Domain\Movement\Entity\Deposit::$type 不存在”
- php - 使用 PHP 的 MongoDB 连接 - 致命错误
- google-chrome - 从 chrome URL 栏发送 CURL/MQTT
- javascript - 反应相对href没有按预期工作
- javascript - 穿过一个圆圈 Javascript
- php - 为 authController 和用户模型使用私有 API