# MySQL 事务管理

# 事务的ACID特性

  1. 原子性(Atomicity)

    • 事务是不可分割的工作单位
    • 事务中的操作要么全部成功,要么全部失败
  2. 一致性(Consistency)

    • 事务执行前后,数据库必须保持一致性状态
    • 所有的完整性约束都必须得到满足
  3. 隔离性(Isolation)

    • 多个事务并发执行时,事务之间不能互相影响
    • 通过隔离级别来控制并发事务的行为
  4. 持久性(Durability)

    • 事务一旦提交,其结果就是永久性的
    • 即使系统崩溃,提交的数据也不会丢失

# 事务控制语句

-- 开始事务
START TRANSACTION;

-- 执行SQL语句
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;

-- 提交事务
COMMIT;

-- 回滚事务
ROLLBACK;

# 事务隔离级别

  1. READ UNCOMMITTED(读未提交)

    • 最低的隔离级别
    • 可能出现脏读、不可重复读和幻读
    SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
    
  2. READ COMMITTED(读已提交)

    • 可以避免脏读
    • 可能出现不可重复读和幻读
    SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
    
  3. REPEATABLE READ(可重复读)

    • MySQL的默认隔离级别
    • 可以避免脏读和不可重复读
    • 可能出现幻读
    SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
    
  4. SERIALIZABLE(串行化)

    • 最高的隔离级别
    • 可以避免所有并发问题
    • 性能最低
    SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    

# 并发问题

  1. 脏读

    • 读取到其他事务未提交的数据
    • 如果其他事务回滚,读取的数据就是无效的
  2. 不可重复读

    • 同一事务中,多次读取同一数据得到不同结果
    • 因为其他事务修改并提交了数据
  3. 幻读

    • 同一事务中,多次查询返回的结果集不同
    • 因为其他事务插入或删除了数据

# 最佳实践

  1. 选择合适的隔离级别

    • 根据业务需求选择隔离级别
    • 权衡数据一致性和性能
    • 大多数情况下REPEATABLE READ是好的选择
  2. 控制事务大小

    • 事务要尽可能小
    • 避免长时间运行的事务
    • 减少锁定的资源
  3. 错误处理

    • 合理使用COMMIT和ROLLBACK
    • 实现完善的错误处理机制
    • 避免事务部分提交