跳到主要内容

数据库事务优化

事务的特性(ACID)

事务具有四个基本特性,通常简称为ACID特性:

  1. 原子性(Atomicity)

    • 事务是不可分割的工作单位
    • 事务中的操作要么全部完成,要么全部不完成
    • 不存在部分完成的情况
  2. 一致性(Consistency)

    • 事务执行前后,数据库都必须处于一致性状态
    • 确保数据库的完整性约束不被破坏
    • 例如:转账前后,总金额保持不变
  3. 隔离性(Isolation)

    • 多个事务并发执行时,各事务之间互不干扰
    • 通过隔离级别来控制事务间的可见性
    • 防止并发事务带来的问题
  4. 持久性(Durability)

    • 事务一旦提交,其修改就永久保存在数据库中
    • 即使系统崩溃,提交的数据也不会丢失
    • 通过日志机制来保证

并发事务问题

在多个事务并发执行时,可能会出现以下问题:

  1. 脏读(Dirty Read)

    • 一个事务读取了另一个未提交事务修改过的数据
    • 如果那个事务回滚,读到的数据就是无效的
  2. 不可重复读(Non-repeatable Read)

    • 同一事务中,多次读取同一数据得到不同结果
    • 因为其他事务在这期间修改了数据
  3. 幻读(Phantom Read)

    • 同一事务中,多次查询返回的结果集不同
    • 因为其他事务插入或删除了满足查询条件的记录

隔离级别说明

各数据库支持的隔离级别及其特点:

隔离级别脏读不可重复读幻读说明
READ UNCOMMITTED可能可能可能最低隔离级别,性能最好
READ COMMITTED不可能可能可能大多数数据库默认级别
REPEATABLE READ不可能不可能可能MySQL默认级别
SERIALIZABLE不可能不可能不可能最高隔离级别,性能最差

事务最佳实践

  1. 合理选择隔离级别

    • 根据业务需求选择适当的隔离级别
    • 在保证数据一致性和并发性能之间找到平衡
  2. 控制事务范围

    • 事务尽可能短小精悍
    • 避免在事务中进行耗时操作
    • 不要在事务中包含不必要的操作
  3. 正确处理异常

    • 在适当的位置进行提交或回滚
    • 使用try-catch块包装事务操作
    • 确保资源正确释放
  4. 避免长事务

    • 长事务会占用系统资源
    • 增加死锁概率
    • 影响系统并发性能
  5. 合理使用保存点

    • 对于复杂事务,使用保存点进行细粒度控制
    • 允许部分回滚,提高灵活性

事务优化策略

1. 控制事务范围

最佳实践
  • 事务要尽可能简短,避免长时间占用数据库连接
  • 避免跨多个数据库的分布式事务,增加了复杂性和失败风险
  • 大量数据查询操作应放在事务外执行
  • 避免在事务中进行网络请求、文件IO等耗时操作
  • 合理设置事务超时时间,避免事务长期挂起

2. 数据库特定实现

  • 事务控制语句:
    START TRANSACTION;  -- 开启事务
    COMMIT; -- 提交事务
    ROLLBACK; -- 回滚事务
  • 自动提交模式:
    SET autocommit = 0;  -- 关闭自动提交
    SET autocommit = 1; -- 开启自动提交(默认)
  • 保存点操作:
    SAVEPOINT point_name;           -- 创建保存点
    ROLLBACK TO SAVEPOINT point_name; -- 回滚到保存点
    RELEASE SAVEPOINT point_name; -- 删除保存点
  • 隔离级别设置:
    -- 会话级别
    SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
    -- 全局级别
    SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;