数据库事务优化
事务的特性(ACID)
事务具有四个基本特性,通常简称为ACID特性:
-
原子性(Atomicity)
- 事务是不可分割的工作单位
- 事务中的操作要么全部完成,要么全部不完成
- 不存在部分完成的情况
-
一致性(Consistency)
- 事务执行前后,数据库都必须处于一致性状态
- 确保数据库的完整性约束不被破坏
- 例如:转账前后,总金额保持不变
-
隔离性(Isolation)
- 多个事务并发执行时,各事务之间互不干扰
- 通过隔离级别来控制事务间的可见性
- 防止并发事务带来的问题
-
持久性(Durability)
- 事务一旦提交,其修改就永久保存在数据库中
- 即使系统崩溃,提交的数据也不会丢失
- 通过日志机制来保证
并发事务问题
在多个事务并发执行时,可能会出现以下问题:
-
脏读(Dirty Read)
- 一个事务读取了另一个未提交事务修改过的数据
- 如果那个事务回滚,读到的数据就是无效的
-
不可重复读(Non-repeatable Read)
- 同一事务中,多次读取同一数据得到不同结果
- 因为其他事务在这期间修改了数据
-
幻读(Phantom Read)
- 同一事务中,多次查询返回的结果集不同
- 因为其他事务插入或删除了满足查询条件的记录
隔离级别说明
各数据库支持的隔离级别及其特点:
- MySQL
- SQL Server
- 达梦数据库
隔离级别 | 脏读 | 不可重复读 | 幻读 | 说明 |
---|---|---|---|---|
READ UNCOMMITTED | 可能 | 可能 | 可能 | 最低隔离级别,性能最好 |
READ COMMITTED | 不可能 | 可能 | 可能 | 大多数数据库默认级别 |
REPEATABLE READ | 不可能 | 不可能 | 可能 | MySQL默认级别 |
SERIALIZABLE | 不可能 | 不可能 | 不可能 | 最高隔离级别,性能最差 |
隔离级别 | 脏读 | 不可重复读 | 幻读 | 说明 |
---|---|---|---|---|
READ UNCOMMITTED | 可能 | 可能 | 可能 | 最低隔离级别 |
READ COMMITTED | 不可能 | 可能 | 可能 | SQL Server默认级别 |
REPEATABLE READ | 不可能 | 不可能 | 可能 | 通过锁机制实现 |
SERIALIZABLE | 不可能 | 不可能 | 不可能 | 最 严格的隔离级别 |
SNAPSHOT | 不可能 | 不可能 | 不可能 | 基于版本控制的隔离级别 |
隔离级别 | 脏读 | 不可重复读 | 幻读 | 说明 |
---|---|---|---|---|
READ COMMITTED | 不可能 | 可能 | 可能 | 达梦默认隔离级别 |
REPEATABLE READ | 不可能 | 不可能 | 可能 | 可通过锁机制实现 |
SERIALIZABLE | 不可能 | 不可能 | 不可能 | 最高隔离级别 |
事务最佳实践
-
合理选择隔离级别
- 根据业务需求选择适当的隔离级别
- 在保证数据一致性和并发性能之间找到平衡
-
控制事务范围
- 事务尽可能短小精悍
- 避免在事务中进行耗时操作
- 不要在事务中包含不必要的操作
-
正确处理异常
- 在适当的位置进行提交或回滚
- 使用try-catch块包装事务操作
- 确保资源正确释放
-
避免长事务
- 长事务会占用系统资源
- 增加死锁概率
- 影响系统并发性能
-
合理使用保存点
- 对于复杂事务,使用保存点进行细粒度控制
- 允许部分回滚,提高灵活性
事务优化策略
1. 控制事务范围
最佳实践
- 事务要尽可能简短,避免长时间占用数据库连接
- 避免跨多个数据库的分布式事务,增加了复杂性和失败风险
- 大量数据查询操作应放在事务外执行
- 避免在事务中进行网络请求、文件IO等耗时操作
- 合理设置事务超时时间,避免事务长期挂起
2. 数据库特定实现
- MySQL
- SQL Server
- 达梦数据库
- 事务控制语句:
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;
- 事务控制语句:
BEGIN TRANSACTION; -- 开启事务
COMMIT TRANSACTION; -- 提交事务
ROLLBACK TRANSACTION;-- 回滚事务 - 保存点操作:
SAVE TRANSACTION point_name; -- 创建保存点
ROLLBACK TRANSACTION point_name;-- 回滚到保存点 - 隔离级别设置:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- 或使用表提示
SELECT * FROM table_name WITH (READCOMMITTED);
- 事务控制语句:
START TRANSACTION; -- 开启事务
COMMIT; -- 提交事务
ROLLBACK; -- 回滚事务 - 自动提交模式:
SET autocommit = FALSE; -- 关闭自动提交
SET autocommit = TRUE; -- 开启自动提交(默认) - 保存点操作:
SAVEPOINT point_name; -- 创建保存点
ROLLBACK TO SAVEPOINT point_name; -- 回滚到保存点
RELEASE SAVEPOINT point_name; -- 删除保存点 - 隔离级别设置:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;