Innodb事务
»Mysql事务特性
事务有ACID四个特性:及原子性、一致性、隔离性、持久性
- 原子性:表示一个事务中的操作要么都发生、要么都不发生
- 一致性:表示事务总是从一种状态转变为另一种状态。
- 隔离性:表示事务之间彼此隔离、一个事务看不到另一个未提交事务的操作。
- 持久性:表示事务提交之后,结果就是永久性的。
事务的隔离级别
事务有四个隔离级别:未提交度、提交度、可重复读、串行读
- 未提交读:表示一个事务可以读取其他事务中没有提交的数据。
- 提交读:表示一个事务可以读取其他事务提交的数据。
- 可重复读:通过next-key lock消除了幻读
- 串行读:最高隔离级别,所有事务都串行化
与此同时,事务过程中有如下问题:
- 脏读:及读到了其他事务未提交脏数据
- 不可重复读:及事务过程中两次读取同一条数据不一致,主要是其他事务修改了这条数据
- 幻读:事务过程中两次读取数据不一致,主要是读到了其他事务往里面插入的数据。
Innodb中事务特性实现方式
-
原子性、持久性保证 通过redo日志实现,及事务提交时会先将事务操作写到redo日志中持久化,当事务进行恢复的时候就可以读取redo日志恢复到之前的状态
-
一致性 通过undo实现。undo存在数据库内部的undo段中,当事务需要回滚时通过读取undo信息将数据回滚到修改之前的状态,通过undo回滚是通过执行事务过程中相反的操作。同时MVCC也是通过undo实现非锁定一致性读。
-
隔离性 隔离性是通过锁实现的,Innodb有行锁、表锁、间隙锁、读锁、写锁等一系列的锁。