1. 事务基础概念与核心特性
事务是数据库操作的最小工作单元,它代表一组不可分割的SQL操作集合。想象你在银行转账的场景:从A账户扣款和向B账户加款这两个操作必须同时成功或同时失败,这就是事务的典型应用场景。
事务的四大特性(ACID)构成了数据库可靠性的基石:
-
原子性(Atomicity):事务内的操作要么全部执行成功,要么全部回滚。通过undo日志实现,当系统崩溃时能够回滚未完成的事务。
-
一致性(Consistency):事务执行前后,数据库从一个一致状态转变为另一个一致状态。比如转账前后两个账户的总额保持不变。
-
隔离性(Isolation):并发事务之间相互隔离,防止数据不一致。这是通过锁机制和MVCC实现的。
-
持久性(Durability):事务提交后,对数据的修改是永久性的。通过redo日志保证,即使系统崩溃也能恢复已提交的事务。
在MySQL中,事务的基本操作非常简单:
sql复制START TRANSACTION; -- 开始事务
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;
COMMIT; -- 提交事务
-- 或者发生错误时 ROLLBACK;
提示:InnoDB引擎默认自动提交(auto-commit)模式,每个SQL语句都被视为独立事务。需要多语句事务时必须显式使用START TRANSACTION。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 并发事务引发的问题解析
当多个事务同时操作相同数据时,如果没有适当的隔离机制,会导致以下几类典型问题:
2.1 脏读(Dirty Read)
事务A读取了事务B修改但未提交的数据。如果事务B最终回滚,事务A读取的就是无效的"脏数据"。
场景示例:
sql复制-- 事务A
START TRANSACTION;
UPDATE products SET stock = stock - 1 WHERE id = 1; -- 库存减1但未提交
-- 事务B
START TRANSACTION;
SELECT stock FROM products WHERE id = 1; -- 读取到未提交的修改
COMMIT;
-- 事务A
ROLLBACK; -- 回滚后,事务B读到的数据就是无效的
2.2 不可重复读(Non-repeatable Read)
同一事务内多次读取同一数据,由于其他事务的修改导致前后读取结果不一致。
场景示例:
sql复制-- 事务A
START TRANSACTION;
SELECT * FROM users WHERE id = 1; -- 第一次读取
-- 事务B
START TRANSACTION;
UPDATE users SET name = '新名字' WHERE id = 1;
COMMIT;
-- 事务A
SELECT * FROM users WHERE id = 1; -- 第二次读取结果与第一次不同
COMMIT;
2.3 幻读(Phantom Read)
类似不可重复读,但针对的是数据集的增减(INSERT/DELETE操作)。同一事务内,相同的条件查询返回不同数量的
