为什么MySQL中没有读提交的锁
我在我的windows机器上使用MySQL 8。正在尝试查看已提交的读取隔离级别为什么MySQL中没有读提交的锁,mysql,isolation-level,transaction-isolation,Mysql,Isolation Level,Transaction Isolation,我在我的windows机器上使用MySQL 8。正在尝试查看已提交的读取隔离级别 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
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 COMMITED还是REPEATABLE READ,上述两种解释都是正确的。T2正在运行非锁定SELECT语句。它不需要等待T1持有的锁,因为T2可以读取T2开始事务发生时提交的行版本
如果运行锁定SELECT语句,则需要等待T1持有的锁
SELECT title FROM todo WHERE id=1 FOR UPDATE;
无论您使用事务隔离级别读取提交还是可重复读取,上述两种解释都是正确的。感谢您的澄清。但其他数据库(如MsSQL)不需要更新语法,它适用于普通的select。如果我选择不更新并准备报告,会发生什么。它将显示错误的报告。为了避免这种情况,我是否需要在所有查询中添加for update?对于报告,使用可重复读取和非锁定选择查询更好。它允许您在一个事务中运行多个SELECT语句,并确保所有SELECT语句都基于相同的数据,以便及时查看快照。它不会锁定。感谢您的澄清。但其他数据库(如MsSQL)不需要更新语法,它适用于普通的select。如果我选择不更新并准备报告,会发生什么。它将显示错误的报告。为了避免这种情况,我是否需要在所有查询中添加for update?对于报告,使用可重复读取和非锁定选择查询更好。它允许您在一个事务中运行多个SELECT语句,并确保所有SELECT语句都基于相同的数据,以便及时查看快照。它这样做没有锁定。