事务详解
事务是关系型数据库的核心特性之一,用于确保数据操作的一致性和可靠性
目录
基本概念
事务(Transaction)是一组原子性的数据库操作序列,具有以下核心特征:
(事务操作要么全部成功,要么全部回滚)
- 不可分割:事务中的操作作为整体执行
- 状态一致性:无论成功与否,总能保持数据库的合法状态
- 执行边界 :明确的开始(
BEGIN
)和结束(COMMIT/ROLLBACK
)标记
事务操作
管理方式对比
方式 | 自动提交 | 控制方法 | 适用场景 |
---|---|---|---|
隐式事务 | 开启(默认) | 系统自动管理 | 简单单语句操作 |
显式事务 | 关闭 | 手动COMMIT/ROLLBACK |
复杂多步骤操作 |
操作语法
mysql
-- 方式1:修改自动提交设置
SET @@autocommit = 0; -- 关闭自动提交
-- 执行DML语句...
COMMIT; -- 成功时提交
ROLLBACK; -- 失败时回滚
-- 方式2:显式事务块
START TRANSACTION;
-- 执行DML语句...
COMMIT; -- 成功提交
ROLLBACK; -- 失败回滚
完整示例
mysql
-- 账户表结构
CREATE TABLE account(
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
name VARCHAR(10) COMMENT '账户名',
money INT COMMENT '余额'
) COMMENT '银行账户';
-- 显式事务示例
SET @@autocommit = 1; -- 确保自动提交开启
BEGIN;
UPDATE account SET money = money - 1000 WHERE name = 'wjj';
UPDATE account SET money = money + 1000 WHERE name = 'jjw';
COMMIT;
-- 异常处理示例
START TRANSACTION;
SAVEPOINT before_transfer; -- 创建保存点
UPDATE account SET money = money - 2000 WHERE name = 'wjj';
-- 假设此时发现异常
ROLLBACK TO before_transfer; -- 回滚到保存点
COMMIT;
ACID特性
特性 | 描述 | 实现机制 |
---|---|---|
原子性 | 事务是不可分割的最小工作单元 | Undo Log(回滚日志) |
一致性 | 保证数据库始终从一种合法状态转换到另一种合法状态 | 约束检查 + 事务机制 |
隔离性 | 并发事务之间相互隔离 | MVCC + 锁机制 |
持久性 | 事务提交后对数据库的修改是永久的 | Redo Log(重做日志) |
并发事务问题
典型并发问题
问题类型 | 现象描述 | 隔离级别解决方案 |
---|---|---|
脏读 | 读取到其他事务未提交的数据 | Read Committed及以上 |
不可重复读 | 同一查询多次访问结果不同(数据被修改) | Repeatable Read及以上 |
幻读 | 同条件查询结果集数量变化(数据被新增/删除) | Serializable |
事务隔离级别
标准隔离级别对比
隔离级别 | 脏读 | 不可重复读 | 幻读 | 性能 |
---|---|---|---|---|
Read Uncommitted | ✔️ | ✔️ | ✔️ | 最高 |
Read Committed | ✖️ | ✔️ | ✔️ | 较高 |
Repeatable Read(默认) | ✖️ | ✖️ | ✔️ | 中等 |
Serializable | ✖️ | ✖️ | ✖️ | 最低 |
隔离级别管理
mysql
-- 查看当前隔离级别
SELECT @@TRANSACTION_ISOLATION;
-- 设置全局隔离级别(需重启会话)
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- 设置会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
最佳实践
-
事务粒度控制
- 保持事务简短(尽量在1秒内完成)
- 避免事务中包含用户交互
-
隔离级别选择
- 默认使用Repeatable Read
- 高并发场景可降级为Read Committed
-
异常处理
- 配合SAVEPOINT实现部分回滚
- 使用
DECLARE...HANDLER
捕获处理错误
-
性能优化
- 长事务定期检查点
- 合理使用行锁/表锁
附:MySQL官方事务文档 链接