MySQL 事务详解
什么是事务
事务就是一组 DML 语句组成,这些语句在逻辑上存在相关性。这一组 DML 语句要么全部成功,要么全部失败,是一个整体。MySQL 提供一种机制,保证我们达到这样的效果。事务还规定不同的客户端看到的数据是不相同的。
简单来说,事务是一种具有业务场景由一个或多个 SQL 语句形成的业务处理语句。 例如:转账业务,它需要事务由两条语句组成,一条删除转账的金额,一条增加转账的金额。并且要么成功要么失败的原子性。 理解成事务并不是一种程序员术语,而是一种用户级的视角。
但一个事务不仅仅只是简单的 SQL 集合,还需要满足如下四个属性:
事务的四大属性
(对于这四大特性,先有个了解即可,后续会通过实例进行细致的讲解)
- 原子性:一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。
- 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
- 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(READ UNCOMMITTED)、读提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。
- 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
上述四大属性,又可以简称 ACID:
原子性(Atomicity,或称不可分割性) 一致性(Consistency) 隔离性(Isolation,又称独立性) 持久性(Durability)
通过上述四大属性 + 多条 SQL 的封装形成事务,最终就能保证 MySQL 的顺利执行。同样的事务在 MySQL 是应该存在的,它同样也就是事务对象数据,然后 MySQL 就能通过结构管理起来。
为什么会出现事务
事务被 MySQL 编写者设计出来,本质是为了当应用程序访问数据库的时候,事务能够简化我们的编程模型,不需要我们去考虑各种各样的潜在错误和并发问题。可以想一下当我们使用事务时,要么提交,要么回滚,我们不会去考虑网络异常了,服务器宕机了,同时更改一个数据怎么办对吧?因此事务本质上是为了应用层服务的。而不是伴随着数据库系统天生就有的。
事务的具体例子
通过 CURD 不加控制,看看会有什么问题?

对于这种情况是绝对不允许发生的,这本质就是数据不一致导致的,那么解决办法是:
- 买票的过程得原子的(原子性)
- 买票互相应该不能影响(隔离性)
- 买完票应该要永久有效吧(持久性)
- 买前,和买后都要是确定的状态吧(一致性)
事务的版本支持
首先不是所有搜索引擎都支持事务(具体如下图)。

其中常见的存储引擎:InnoDB 支持事务,而 MyISAM 并不支持事务。
事务的提交
事务的提交方式常见的有两种:
- 自动提交
- 手动提交
























