事务就是用户定义的一系列执行SQL语句的操作, 这些操作要么完全地执行,要么完全地都不执行, 它是一个不可分割的工作执行单元。
在MySQL中,只有 InnoDB 存储引擎才有事务。
在同一个事务中,执行的操作要么全部成功,要么同时执行成功,要么同时执行失败;在不同的事务中,它们对数据库的操作是不受相互的影响。
在MySQL的事务中有四个重要的特性,也就是 ACID 特性(原子性、一致性、隔离性和持久性)
① A 表示 Atomicity 原子性:确保同一个事务中,所有的 DML 操作,也就是增删改操作,要么全部成功执行,要么全部回滚,以保持数据的完整性和一致性。
之所以失败操作能进行回滚,是因为 InnoDB 设计了一 个 UNDO_LOG 表,在事务执行的过程中,把修改之前的数据快照保存到 UNDO_LOG 里面,一旦出现错误,就直接从 UNDO_LOG 里面读取数据,也就实现回滚操作。
② C 表示 Consistency 一致性:表示事务执行过程中遵循数据库的完整性约束,以保持数据的正确性和完整性。这个更多是依赖于业务层面的保证,数据库本身也提供了一些,比如主键的唯一性、外键约束、默认值约束、非空约束、字段的长度与类型的保证等等。
③ I 表示 Isolation 隔离性:表示在多个并发事务对同一个数据进行操作的时候, 事务之间是相互隔离,可以避免数据的相互干扰和不一致性。
在MySQL中,有四种事务的隔离级别。
而InnoDB 默认的隔离级别是可重复读(RR:Repeatable Read),它使用了 MVCC 机制解决了脏读和不可重复读的问题
④ D 表示 Durability 持久性:表示只要事务一旦提交成功,那对于这条数据结果的影响是永久性的,也就是持久化存储在磁盘上,即使在系统故障或断电后也不会丢失。