MySQL事务处理
事务概述
1. 什么是事务
flowchart TD
A[开始] --> B[开始事务]
B --> C[执行SQL操作]
C --> D{所有操作成功?}
D -->|是| E[提交事务]
D -->|否| F[回滚事务]
E --> G[结束]
F --> G
事务是数据库操作的基本单位,是一组原子性的SQL语句,要么全部执行成功,要么全部执行失败。
2. 事务的特性(ACID)
- 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成
- 一致性(Consistency):事务执行前后,数据库从一个一致状态变为另一个一致状态
- 隔离性(Isolation):并发事务之间互不影响
- 持久性(Durability):事务一旦提交,其结果就是永久性的
事务实现
1. 事务控制语句
-- 开始事务
START TRANSACTION;
-- 或
BEGIN;
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;
-- 设置保存点
SAVEPOINT point_name;
-- 回滚到保存点
ROLLBACK TO point_name;
2. 事务示例
-- 转账事务示例
START TRANSACTION;
UPDATE accounts SET balance = balance - 100
WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100
WHERE account_id = 2;
-- 检查余额是否足够
SELECT balance FROM accounts WHERE account_id = 1;
-- 如果余额足够,提交事务
COMMIT;
-- 如果余额不足,回滚事务
-- ROLLBACK;
事务隔离级别
1. 隔离级别说明
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
READ UNCOMMITTED | 可能 | 可能 | 可能 |
READ COMMITTED | 不可能 | 可能 | 可能 |
REPEATABLE READ | 不可能 | 不可能 | 可能 |
SERIALIZABLE | 不可能 | 不可能 | 不可能 |
2. 设置隔离级别
-- 查看当前隔离级别
SELECT @@transaction_isolation;
-- 设置会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- 设置全局隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
事务并发控制
1. 锁机制
-- 共享锁(读锁)
SELECT * FROM accounts WHERE account_id = 1 LOCK IN SHARE MODE;
-- 排他锁(写锁)
SELECT * FROM accounts WHERE account_id = 1 FOR UPDATE;
2. 死锁处理
-- 查看死锁信息
SHOW ENGINE INNODB STATUS;
-- 设置死锁超时
SET innodb_lock_wait_timeout = 50;
事务最佳实践
1. 事务设计原则
- 事务要尽可能短
- 避免在事务中进行远程调用
- 避免在事务中进行大量数据操作
- 合理设置事务隔离级别
2. 性能优化
-- 设置自动提交
SET autocommit = 1;
-- 设置事务超时
SET innodb_lock_wait_timeout = 50;
-- 设置死锁检测
SET innodb_deadlock_detect = ON;
注意事项
-
事务管理
- 事务大小控制
- 超时处理
- 死锁预防
- 错误处理
-
性能考虑
- 并发控制
- 锁等待
- 事务日志
- 资源消耗
-
运维管理
- 监控告警
- 性能分析
- 故障处理
- 数据恢复
-
重要参数
- innodb_lock_wait_timeout
- innodb_deadlock_detect
- transaction_isolation
- autocommit