SQL 事务

数据库事务是数据库的一个操作序列。

一、为什么需要事务?

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

例如:

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

  • 从 A 账户扣除 100 元
  • 向 B 账户中增加 100 元

在这个过程中可能会出现以下问题:

  • 两步中的一步执行失败,A 和 B 的账户上平白增加或失去了 100 元
  • 转账操作完成系统崩溃,系统重启恢复时丢失了崩溃前的转账记录
  • 多个用户同时向 B 账户转账时,同时对 B 账户进行操作,导致 B 账户金额出现异常

二、什么是事务?

事务是一个包含多个步骤的业务操作。

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

三、事务的特性

  • 原子性 A:事务是最小执行单位,不可再分;要么做要么不做,不能只做一部分
  • 一致性 C:事务的执行必须使数据库从一个一致性状态转换至另一个一致性状态;事务的执行不能破坏数据库数据的完整性和一致性
  • 隔离性 I:各个事务之间的执行互不干扰
  • 持久性 D:事务的执行结果将被存储

四、事务的组成

1
2
3
4
5
开始事务

增、删、改、查语句

commit/表结构语句/数据库控制语句/正常退出 || rollback/异常退出

需要注意的是:

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

五、开启事务

1. 为窗口开启事务

1
SET AUTOCOMMIT = {0}

一旦在 MySQL 的命令行窗口中输入该命令,则关闭了自动提交并开启了事务。

输入命令后,该窗口中的 SQL 语句将不会立即执行,需要等待提交。

2. 临时开启事务

可以通过 start transactionbegin 命令临时性开启一次事务。

该命令之后的语句将不会立即执行,需要等待提交。

六、提交事务

提交事务表示事务结束。

当数据库在执行事务时,如果从事务开始到事务提交的所有操作都成功,则会将所有操作结果一起保存。

可以通过显式提交或隐式提交表示事务的结束,确保了操作的一起成功。。

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

七、回滚

当事务执行过程中发生异常时,系统将会自动结束事务,并对事务操作进行回滚。

并且,当程序判断确定事务执行出现“意外”结果时,可以由程序主动结束事务,并对事务操作进行回滚。

通过回滚确保了操作的一起失败

  • rollback:显式回滚

  • 异常退出

参考

  • 数据库系统概论