# 为什么需要事务?

在现实生活中,许多操作理应是一个整体,它们应该一起成功或一起失败。

例如:
从 A 账户中转账 100 元至 B 账户,如果被分成两个操作:

  • 从 A 账户扣除 100 元
  • 向 B 账户中增加 100 元
    在这个过程中可能会出现以下问题:
  • 两步中的一步执行失败,A 和 B 的账户上平白增加或失去了 100 元
  • 转账操作完成系统崩溃,系统重启恢复时丢失了崩溃前的转账记录
  • 多个用户同时向 B 账户转账时,同时对 B 账户进行操作,导致 B 账户金额出现异常

# 什么是事务?

事务是一个包含多个步骤的业务操作。
如果业务操作被事务管理,则多个步骤要么同时成功,要么同时失败。

# 事务的特性

  • 原子性:事务是最小执行单位,不可再分
  • 一致性:事务的执行结果,必须使数据库从一个一致性状态,转换至另一个一致性状态,即事务执行后不会得到错误的结果
  • 隔离性:各个事务之间的执行互不干扰
  • 持久性:事务的执行结果将被存储

# 事务的组成

开始事务  
增、删、改、查语句  
commit/表结构语句/数据库控制语句/正常退出 || rollback/异常退出
1
2
3

需要注意的是:
默认情况下,MySQL 关闭了事务、开启了自动提交,它会在每句语句输入后自动提交并执行。

# 开启事务

为窗口开启事务

SET AUTOCOMMIT = {0}
1

一旦在 MySQL 的命令行窗口中输入该命令,则关闭了自动提交并开启了事务。
输入命令后,该窗口中的 SQL 语句将不会立即执行,需要等待提交。
临时开启事务
可以通过 start transactionbegin 命令临时性开启一次事务。
该命令之后的语句将不会立即执行,需要等待提交。

# 提交事务

提交事务表示事务结束。
当数据库在执行事务时,如果从事务开始到事务提交的所有操作都成功,则会将所有操作结果一起保存。
可以通过显式提交或隐式提交表示事务的结束,确保了操作的一起成功

  • commit:显式提交
  • 表结构语句/数据库控制语句:一旦执行以上语句,则事务将会立即提交
  • 正常退出

# 回滚

当事务执行过程中发生异常时,系统将会自动结束事务,并对事务操作进行回滚。
并且,当程序判断确定事务执行出现“意外”结果时,可以由程序主动结束事务,并对事务操作进行回滚。
通过回滚确保了操作的一起失败

  • rollback:显式回滚
  • 异常退出