一、什么是事务?
事务(Transaction)是数据库操作的最小逻辑单元,它代表一组不可分割的SQL操作,要么全部成功,要么全部失败。事务的存在确保了数据库从一个一致状态转换到另一个一致状态,即使发生系统故障或人为中断。
经典场景示例:银行转账
用户A向用户B转账100元
步骤1:从A账户扣除100元
步骤2:向B账户增加100元 若步骤1完成后系统崩溃,事务机制能自动回滚,避免数据不一致。
二、事务的ACID特性
三、MySQL事务操作命令
开启事务
START TRANSACTION; -- 或 BEGIN;
提交事务
COMMIT; -- 确认所有操作生效
回滚事务
ROLLBACK; -- 撤销未提交的操作
设置保存点(Savepoint)
SAVEPOINT sp1; -- 创建回滚标记 ROLLBACK TO sp1; -- 回滚到指定标记
示例代码:完整的转账事务
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 'A';
UPDATE accounts SET balance = balance + 100 WHERE user_id = 'B';
COMMIT; -- 若任一UPDATE失败,则执行ROLLBACK
四、事务隔离级别与并发问题
MySQL支持四种隔离级别(由低到高):
默认级别:
REPEATABLE READ
(通过多版本并发控制MVCC实现)设置方法:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
五、事务的最佳实践
应用场景
电商订单(扣库存+生成订单)
批量数据导入
账户余额变更
注意事项
避免长事务(减少锁竞争)
合理选择隔离级别(平衡一致性与性能)
显式控制事务(代替自动提交
autocommit=1
)配合锁机制(如
SELECT ... FOR UPDATE
)处理高并发
常见陷阱
DDL语句(如
ALTER TABLE
)会隐式提交事务部分客户端工具默认启用自动提交
嵌套事务需通过保存点实现
六、进阶:分布式事务
对于跨数据库的场景(如银行跨行转账),MySQL提供XA事务:
XA START 'txn1'; -- 开启分布式事务
-- 执行跨库操作...
XA END 'txn1';
XA PREPARE 'txn1'; -- 两阶段提交
XA COMMIT 'txn1';
七、总结
事务是数据库系统的基石,正确使用事务可以: ✅ 防止数据不一致 ✅ 提升系统可靠性 ✅ 支持复杂业务逻辑 通过SHOW ENGINE INNODB STATUS
命令可监控事务状态,结合EXPLAIN分析性能瓶颈。
延伸学习:
锁机制(行锁、间隙锁、表锁)
事务日志(Redo Log & Undo Log)
性能优化(批量提交、索引设计)
掌握事务机制,才能真正驾驭MySQL的数据管理能力!
评论