脏读、不可重读度、幻读
1、脏读:脏读是指一个事务可以读取到另一个事务尚未提交的数据。
2、不可重复读:不可重复读是指同一个事务中,前后两次查询同一条记录,结果不一致,因为中间该记录被其他事务修改了并提交了。
不可重复读的例子:
初始数据:
| id | name | balance |
|---|---|---|
| 1 | 张三 | 100 |
| 事务A |
BEGIN;
SELECT balance FROM user WHERE id = 1; -- 得到 100
事务 B(并发事务):
BEGIN;
UPDATE user SET balance = 50 WHERE id = 1;
COMMIT;
事务 A 继续:
SELECT balance FROM user WHERE id = 1; -- 得到 50(发生了不可重复读)
3、幻读:事务在读取某个范围内的记录时,另一个事务往这个范围插入了新记录,导致前后两次读取的结果不一致,多出“幻影”记录
幻读的例子:
CREATE TABLE orders ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT, amount DECIMAL(10, 2) );
| id | user_id | amount |
|---|---|---|
| 1 | 1001 | 200.00 |
| 2 | 1002 | 150.00 |
START TRANSACTION;
SELECT * FROM orders WHERE amount > 100;
-- 返回两条记录,id=1 和 id=2
START TRANSACTION;
INSERT INTO orders(user_id, amount) VALUES (1003, 300.00);
COMMIT;
SELECT * FROM orders WHERE amount > 100;
-- 结果现在有 3 条记录!新插入的这条也被查出来
-- 这就是“幻读”

浙公网安备 33010602011771号