Mysql 幻读,当前读和快照读

文章讨论了数据库管理系统中的幻读现象,特别是在MySQL中,当使用可重复读(RR)隔离级别时,如何通过间隙锁来部分解决幻读问题。幻读发生于事务读取特定范围数据时,另一事务在此范围内插入新行。在RR隔离级别下,间隙锁防止了新的插入发生在已读取的记录间隙中,但当前读情况下仍可能出现幻读。文章通过实例展示了幻读的产生及RR隔离级别的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是幻读

幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户在读取该范围的数据行时,会发现有新增行数据;

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当前读能查询到

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值