mysql 不可重复读解析

不可重复读是指在一个事务内,两次读取同一条记录,得到的数据值不一致。这种现象在 READ-COMMITTED(读已提交) 隔离级别下会发生,因为该级别下,事务每次读取都能看到其他事务已提交的最新修改。

 

-- 创建订单表
CREATE TABLE `orders` (
  `id` INT PRIMARY KEY AUTO_INCREMENT,
  `order_no` VARCHAR(20) NOT NULL,
  `status` TINYINT DEFAULT 0 COMMENT '0-待支付,1-已支付,2-已取消'
) ENGINE=InnoDB;


-- 插入一条待支付订单
INSERT INTO `orders` (`order_no`, `status`) VALUES ('ORD20260820001', 0);

 

image

 

结果:

  1. 在 T1 时刻,事务A读取到订单状态为 0(待支付)。
  2. 事务B在 T2 修改该订单状态为 1(已支付) 并提交。
  3. 事务A在 T3 再次读取同一条记录时,得到的值变成了 1。

 

事务A在同一个事务内,两次读取相同记录却得到了不同的结果 —— 这就是不可重复读。

 

危害:

如果事务A在第一次读取(待支付)后,基于该状态进行了一些业务判断(比如准备发送支付提醒),而在第二次读取时发现状态已变,那么之前的业务决策就可能失效,导致逻辑混乱。

 

image

 

 

posted @ 2023-06-22 09:07  方达达  阅读(4)  评论(0)    收藏  举报