1. 数据库并发问题全景解读
当多个事务同时操作数据库时,会出现三类典型的并发问题:脏读(Dirty Read)、不可重复读(Non-repeatable Read)和幻读(Phantom Read)。这些问题就像多人同时编辑同一份文档时出现的冲突场景——有人看到未保存的草稿,有人发现之前查到的数据突然变化,还有人发现凭空多出了新记录。
以电商库存系统为例:事务A查询商品库存为100件,此时事务B修改库存为80件但尚未提交。如果事务A读取到未提交的80这个"脏数据",就可能做出错误的库存判断。这就是典型的脏读场景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 三大问题深度解析
2.1 脏读:读取未提交的"幽灵数据"
脏读发生在事务A读取了事务B修改但未提交的数据时。如果事务B最终回滚,事务A使用的就是根本不存在的"幽灵数据"。
sql复制-- 事务B(未提交)
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
-- 事务A读取到未提交的修改
SELECT balance FROM accounts WHERE user_id = 1; -- 看到减少后的余额
-- 事务B回滚
ROLLBACK;
关键特征:读取到其他事务未提交的中间状态数据,这些数据可能最终不会真实存在
2.2 不可重复读:同一查询结果前后不一
不可重复读指在同一事务内,连续两次执行相同查询却得到不同结果。这通常是因为其他已提交事务修改了数据。
sql复制-- 事务A第一次查询
SELECT quantity FROM products WHERE id = 101; -- 返回100
-- 事务B提交更新
UPDATE products SET quantity = 80 WHERE id = 101;
COMMIT;
-- 事务A第二次相同查询
SELECT quantity FROM products WHERE id = 101; -- 返回80
与脏读的区别:这里读取的是已提交的数据,但破坏了事务内的一致性预期
2.3 幻读:神秘出现的数据行
幻读特指在同一事务内,相同的条件查询突然返回了之前不存在的"幻影行"。这通常是因为其他事务插入了新记录。
`
