MySQL如何实现避免幻读
什么是幻读
幻读是指在一个事务(T1)中执行了一个查询(Q1),然后在不久之后另一个事务(T2)插入一条符合条件的数据,这会导致T1再次执行时会出现新的数据行,就像产生了幻觉一样。幻读跟不可重复读是不同的,不可重复读是行的更新或删除,幻读是行的插入。
InnoDB如何避免幻读
InnoDB通过MVCC(多版本并发控制)机制避免幻读, MVCC就是在每一行记录后面都保存着隐藏的两个列——DB_TRX_ID和DB_ROLL_PTR。但每个事务的访问只能看到在该事务启动时已经提交的数据,没看到的部分是被该事务启动之后并提交之前的其他所有事务“看到”的。InnoDB用这种机制使得每个事务彼此不干扰,也不会互相影响。
一些操作Tip
在InnoDB里,事务可以分为四种隔离级别,可通过SET TRANSACTION语句来设置,级别依次为read uncommitted(读未提交)、read committed(读已提交)、repeatable read(可重复读)、serializable(串行化)。通过设置相应级别,可以在不同程度上减轻幻读。