事务通过ACID特性保障数据一致性:原子性确保操作全成功或全失败,隔离性防止并发冲突,持久性依赖日志实现崩溃恢复,但需避免长事务和不当操作以维持性能。

事务保证数据不会“半途而废”
当多条 SQL 操作必须一起成功或一起失败时(比如转账:A 减钱、B 加钱),单条执行出错会导致数据不一致。COMMIT 和 ROLLBACK 让你明确控制这批操作的最终状态——要么全部生效,要么全部撤销,不存在“只扣了 A 的钱、B 没收到”的中间态。
并发修改不会互相覆盖
多个事务同时读写同一行时,数据库靠隔离级别和锁机制避免脏读、不可重复读、幻读。SELECT ... FOR UPDATE 在读取时加行锁,防止其他事务改同一行;REPEATABLE READ 级别下,两次 SELECT 同一范围结果一致,即使别人插入了新行(InnoDB 用间隙锁防幻读)。
崩溃后数据仍可恢复
事务日志(如 InnoDB 的 ib_logfile)记录了每个事务的物理变更。即使 MySQL 异常宕机,重启时也能根据日志重做(REDO)已提交事务、回滚(UNDO)未提交事务。没写进日志的操作,数据库根本不承认它发生过。
无论做任何事情,都要有一定的方式方法与处理步骤。计算机程序设计比日常生活中的事务处理更具有严谨性、规范性、可行性。为了使计算机有效地解决某些问题,须将处理步骤编排好,用计算机语言组成“序列”,让计算机自动识别并执行这个用计算机语言组成的“序列”,完成预定的任务。将处理问题的步骤编排好,用计算机语言组成序列,也就是常说的编写程序。在Pascal语言中,执行每条语句都是由计算机完成相应的操作。编写Pascal程序,是利用Pasca
事务不是万能的,滥用反而拖慢系统
长事务会持有锁更久、膨胀 undo log、阻塞 MVCC 清理,导致性能下降甚至锁表。
- 避免在事务里做 HTTP 调用、文件读写、用户交互等耗时操作
-
AUTOCOMMIT=OFF下忘记COMMIT或ROLLBACK,连接可能长期占用资源 - 高并发场景下,尽量缩短事务内 SQL 数量和执行时间,把非关键逻辑移出事务块
真正难的不是开启事务,而是判断哪几条语句必须包在一起、该用什么隔离级别、以及怎么让事务既安全又不卡住别人。









