数据库的隔离级别分为四个等级:
- read uncommitted(读未提交) ,事务A可以读取到事务B未提交的数据,事务B回滚,则事务A中的数据为
脏数据
- read committed(读已提交) ,事务A只能读取到事务B已提交的数据,会产生
不可重复读
与幻读
的问题 - repeatable read(可重复读),解决了
不可重复读
的问题,但幻读
依然存在 - serializable(串行读)
不可重复读
,事务A读取数据后,事务B对数据进行更新,事务A再次读取数据时,两次读取的数据不一致称为不可重复读。
幻读
,事务A按范围读取N行数据,事务B更新或新增数据,事务A再次读取相同范围的数据时,与首次读取的行数不同。
InnoDB中的隔离级别
InnoDB中的默认隔离级别为repeatable read
,该等级下的不可重复读
,InnoDB通过MVCC
来解决,幻读
通过间隙锁
来解决。
MVCC
,InnoDB中,每行数据有两个隐藏列,一列记录“创建行的 事务版本号”,一列记录“删除行的事务版本号 ”。
select,读取的数据为create_version<=current_version && (del_version==null || current_version<del_version)
insert,create_version=current_version,del_version=current_version
update,新插入一行,现有原数据行del_version=current_version
与新数据行create_version=current_version
delete,del_version=current_version
间隙锁,不对具体的数据行加锁,而是对数据行之间的间隙加锁。