# MySQL 事务管理
# 事务的ACID特性
原子性(Atomicity)
- 事务是不可分割的工作单位
- 事务中的操作要么全部成功,要么全部失败
一致性(Consistency)
- 事务执行前后,数据库必须保持一致性状态
- 所有的完整性约束都必须得到满足
隔离性(Isolation)
- 多个事务并发执行时,事务之间不能互相影响
- 通过隔离级别来控制并发事务的行为
持久性(Durability)
- 事务一旦提交,其结果就是永久性的
- 即使系统崩溃,提交的数据也不会丢失
# 事务控制语句
-- 开始事务
START TRANSACTION;
-- 执行SQL语句
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;
# 事务隔离级别
READ UNCOMMITTED(读未提交)
- 最低的隔离级别
- 可能出现脏读、不可重复读和幻读
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
READ COMMITTED(读已提交)
- 可以避免脏读
- 可能出现不可重复读和幻读
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
REPEATABLE READ(可重复读)
- MySQL的默认隔离级别
- 可以避免脏读和不可重复读
- 可能出现幻读
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SERIALIZABLE(串行化)
- 最高的隔离级别
- 可以避免所有并发问题
- 性能最低
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
# 并发问题
脏读
- 读取到其他事务未提交的数据
- 如果其他事务回滚,读取的数据就是无效的
不可重复读
- 同一事务中,多次读取同一数据得到不同结果
- 因为其他事务修改并提交了数据
幻读
- 同一事务中,多次查询返回的结果集不同
- 因为其他事务插入或删除了数据
# 最佳实践
选择合适的隔离级别
- 根据业务需求选择隔离级别
- 权衡数据一致性和性能
- 大多数情况下REPEATABLE READ是好的选择
控制事务大小
- 事务要尽可能小
- 避免长时间运行的事务
- 减少锁定的资源
错误处理
- 合理使用COMMIT和ROLLBACK
- 实现完善的错误处理机制
- 避免事务部分提交
← MySQL 索引优化 MySQL 性能优化 →