1、什么是事务?
事务是一组原子性的SQL查询,或者说是一个独立的工作单元。对于事务内的语句,要么全部执行成功,要么全部失败。
2、事务的特点
总结下来就是四个特性原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)
2.1 原子性
一个事务必须最小的工作单元,整个事务中的操作要不全部成功,要不全部失败。不可能执行事务里面一部分操作。
2.2一致性
数据库总是从一个一致性状态到另一个一致性的状态。
2.3隔离性
通常来说,一个事务在未提交之前,对其他事务不可见。
2.4 持久性
一旦事务提交,对数据库的改变就会永久的保存到数据库中。
3 隔离级别
3.1 未提交读
事务中的修改,即使没有提交,对于其他事务也是可见的。事务可以读取未提交的数据,这种情况会导致脏读。
3.2 提交读
一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。也叫不可重复读,因为执行两次相同的查询,可能会得到不同的结果。
3.3 可重复读
保证了在同一事务中多次读取同样的记录结果是一致的。理论上会存在幻读的情况。什么是幻读呢,就是指当前事务在读取该范围的记录时,另一个事务又在该范围内插入了新的记录,当当前事务再次读取该范围的内容时,会产生幻行。InnoDB和XtraDB存储引擎通过多版本并发控制解决幻读问题。
3.4 可串行化
强制事务串行执行,会在读取的每一行数据上加锁。解决了幻读的问题。
4 死锁
死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,产生的恶性循环的现象。 InnoDB的处理方法是将持有最少行级排他锁的事务回滚。
5 多版本并发控制(MVCC)
5.1 MVCC解释
MVCC是通过保存数据在某个时间点的快照来实现的,也就是说,不管执行多长时间,每个事务看到的数据都是一致的。
InnoDB的MVCC是通过在每行记录后面保存的两个隐藏列实现的,这两个列,一个保存了行的创建时间,一个保存了行的删除时间。当然存储的不是时间值,而是系统版本号。每当开启一个事务的时候,系统的版本号就会递增,事务开始时候的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号做比较。
5.2 MVCC具体操作
5.2.1 select
InnoDB只查找版本早于当前事务的数据行,这样保证事务读取的行,要么是事务开始之前已经存在,要么是事务自身插入或者修改的。
行的删除版本要么未定义,要么大于当前事务的版本号,这样就保证事务读取到的行,在事务开启之前未删除。
5.2.2 insert
InnoDB为新插入的每一行保存当前系统的版本号作为行版本号。
5.2.3 update
InnoDB为插入一行新记录,保存当前系统版本号作为行版本号,同时保存当前系统的版本号到原来行作为行删除标识。
5.2.4 delete
InnoDB为删除的每一行保存当前系统的版本号作为删除标识。