什么是幻读
幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户在读取该范围的数据行时,会发现有新增行数据;
mysql 在RR(可重复读)隔离级别利用间隙锁机制下一定程度上解决了幻读。
这里的一定程度上 是指 只有快照读的情况。当前读情况并未解决幻读。
当前读
select * from table for update
快照读
select * from table
示例说明
表中数据
DROP TABLE IF EXISTS `t_user_test`;
CREATE TABLE `t_user_test` (
`id` int NOT NULL,
`user_id` int NULL DEFAULT NULL,
`user_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
`city` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `idx_uid`(`user_id`) USING BTREE COMMENT '用户ID唯一索引',
INDEX `idx_uname`(`user_name`) USING BTREE COMMENT '用户姓名普通索引'
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;
insert into t_user_test VALUES(1,1001,'张三','深圳'),
(2,1005,'李四','惠州'),
(3,1009,'王五','佛山'),
(4,1020,'赵六','珠海');
步骤一
取消事务自动提交 set @@autocommit=0
步骤二
同时开启事务,并查询一次数据
begin;
select * from t_user_test;
步骤三
Session3 新增一条数据 insert into t_user_test values(8,1002,'秦七','东莞');
但是不commit, 很明显 此时Session 3能查询到,Session1.2查询不到
步骤四
Session3 commit; 此时Session3能查询到,由于当前事务默认隔离级别 可重复读,所以Session2快照读查询不到,Session1当前读能查询到