一、什么是事务?

事务(Transaction)是数据库操作的最小逻辑单元,它代表一组不可分割的SQL操作,要么全部成功,要么全部失败。事务的存在确保了数据库从一个一致状态转换到另一个一致状态,即使发生系统故障或人为中断。

经典场景示例:银行转账

  • 用户A向用户B转账100元

  • 步骤1:从A账户扣除100元

  • 步骤2:向B账户增加100元 若步骤1完成后系统崩溃,事务机制能自动回滚,避免数据不一致。


二、事务的ACID特性

特性

说明

实际意义

原子性
(Atomicity)

事务是一个不可分割的整体

避免“部分成功”导致数据混乱

一致性
(Consistency)

事务前后数据库满足所有约束(如主键, 外键)

保证业务规则不被破坏

隔离性
(Isolation)

并发事务互不干扰

防止脏读、幻读等问题

持久性
(Durability)

事务提交后修改永久保存

即使宕机数据也不丢失


三、MySQL事务操作命令

  1. 开启事务

    START TRANSACTION;  -- 或 BEGIN;
  2. 提交事务

    COMMIT;  -- 确认所有操作生效
  3. 回滚事务

    ROLLBACK;  -- 撤销未提交的操作
  4. 设置保存点(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支持四种隔离级别(由低到高):

隔离级别

脏读

不可重复读

幻读

性能

READ UNCOMMITTED

最高

READ COMMITTED

REPEATABLE READ

SERIALIZABLE

  • 默认级别REPEATABLE READ(通过多版本并发控制MVCC实现)

  • 设置方法

    SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

五、事务的最佳实践

  1. 应用场景

    • 电商订单(扣库存+生成订单)

    • 批量数据导入

    • 账户余额变更

  2. 注意事项

    • 避免长事务(减少锁竞争)

    • 合理选择隔离级别(平衡一致性与性能)

    • 显式控制事务(代替自动提交autocommit=1

    • 配合锁机制(如SELECT ... FOR UPDATE)处理高并发

  3. 常见陷阱

    • 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的数据管理能力!