最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

每日报道:MySQL的RR和RC事务隔离级别加锁类型验证

来源:博客园


(相关资料图)

先上结轮:MySQL5.7数据库Innodb引擎在默认的 REPEATABLE-READ(可重复读RR) 事务隔离级别时,事务修改类操作对于where范围条件锁定的行区加的是Next-Key Lock 即临键间隙锁,对于确切条件锁定的行加的是RECORD LOCKS 即普通行锁,并且无法读到自身事务范围之外其他事务的提交(而且自身事务锁定的范围无法被其他事务修改或插入新值);在READ-COMMITTED(读已提交RC)事务隔离级别时,事务修改类操作对于where范围条件或确切条件锁定的行加的都是RECORD LOCKS 即普通行锁,并且能够读到自身事务锁定行范围之外其他事务的提交(但自身事务锁定的行无法被其他事务修改);

-- 打开Innodb状态输出开关set GLOBAL innodb_status_output=ON;-- 打开Innodb锁状态输出开关set GLOBAL innodb_status_output_locks=ON;-- 查看当前数据库隔离级别select @@transaction_isolation;-- 设置会话的事务隔离级别(RC的设为 "READ-COMMITTED" )set @@session.transaction_isolation = "REPEATABLE-READ"; COMMIT;-- 设置会话的隔离级别(RC的设为 COMMITTED READ)set session transaction isolation level REPEATABLE READ;COMMIT;-- 以后脚本手工一行一行执行(在另一个窗口,另个其他事务进行各种场景的验证,并到Linux上的MySQL客户端用 show engine innodb status\G 命令查看上锁状态)BEGIN;SELECT * from test_user WHERE id=1;UPDATE test_user set NAME="1234" WHERE id<4;SELECT * from test_user WHERE id=6;-- 最后执行回滚ROLLBACK;

RR事务隔离级别时的锁状态(临键间隙锁):

2 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1MySQL thread id 2, OS thread handle 139641668019968, query id 257 192.168.17.1 xurmTrx read viewwill not see trx with id >= 6928, sees < 6928  # RR级别多输出的一行,表明了只会产生一次 read view,并确定了其可看到的事务id 范围!TABLE LOCK table `test`.`test_user` trx id 6928 lock mode IXRECORD LOCKS space id 26 page no 3 n bits 72 index PRIMARY of table `test`.`test_user` trx id 6928 lock_mode XRecord lock, heap no 2 PHYSICAL RECORD: n_fields 6; compact format; info bits 0

RC事务隔离级别时的锁状态(排他锁(X)行锁,但非间隙锁):

2 lock struct(s), heap size 1136, 1 row lock(s), undo log entries 1MySQL thread id 2, OS thread handle 139641668019968, query id 630 192.168.17.1 xurmTABLE LOCK table `test`.`test_user` trx id 6941 lock mode IXRECORD LOCKS space id 26 page no 3 n bits 80 index PRIMARY of table `test`.`test_user` trx id 6941 lock_mode X locks rec but not gapRecord lock, heap no 8 PHYSICAL RECORD: n_fields 6; compact format; info bits 0

再配合两种隔离级别下事务范围内的 read view (读视图)生成机制:RR事务隔离级别只在第一次MVCC读(即快照读)时生成一次事务的read view,即一次性确定read view的可见事务范围,因此可以做到可重复读而RC事务隔离级别会在每一次MVCC读时都重新生成一次事务的read view,因此能够读到其他事务的已提交数据

关键词: 隔离级别