事务
1、事务与存储引擎的关系
事务是由 MySQL 的引擎来实现的,我们常见的 InnoDB 引擎它是支持事务的。
不过并不是所有的引擎都能支持事务,比如 MySQL 原生的 MyISAM 引擎就不支持事务,也正是这样,所以大多数 MySQL 的引擎都是用 InnoDB。
2、事务的特性
(1)原子性:一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。
(2)一致性:是指事务操作前和操作后,数据满足完整性约束,数据库保持一致性状态。
(3)隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致,因为多个事务同时使用相同的数据时,不会相互干扰,每个事务都有一个完整的数据空间,对其他并发事务是隔离的。
(4)持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
3、事务特性的实现方式
(1)持久性是通过 redo log (重做日志)来保证的;
(2)原子性是通过 undo log(回滚日志) 来保证的;
(3)隔离性是通过 MVCC(多版本并发控制) 或锁机制来保证的;
(4)一致性则是通过持久性+原子性+隔离性来保证;
4、并行事务会引发什么问题?
(1)如果一个事务「读到」了另一个「未提交事务修改过的数据」,就意味着发生了「脏读」现象。
(2)在一个事务内多次读取同一个数据,如果出现前后两次读到的数据不一样的情况,就意味着发生了「不可重复读」现象。
(3)在一个事务内多次查询某个符合查询条件的「记录数量」,如果出现前后两次查询到的记录数量不一样的情况,就意味着发生了「幻读」现象。
5、事务的隔离级别有哪些?
(1)读未提交:指一个事务还没提交时,它做的变更就能被其他事务看到;
(2)读提交:指一个事务提交之后,它做的变更才能被其他事务看到;
(3)可重复读:指一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的。
(4)串行化:会对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行;
在「读未提交」隔离级别下,可能发生脏读、不可重复读和幻读现象;
在「读提交」隔离级别下,可能发生不可重复读和幻读现象,但是不可能发生脏读现象;
在「可重复读」隔离级别下,可能发生幻读现象,但是不可能脏读和不可重复读现象;
在「串行化」隔离级别下,脏读、不可重复读和幻读现象都不可能会发生。