mysql事务隔离级别
默认:Repeatable read 重复读
一、原理
InnoDB 的行数据有多个版本(MVCC),每个数据版本有自己的 row trx_id,每个事务或者语句有自己的一致性视图。普通查询语句是一致性读,一致性读会根据 row trx_id 和一致性视图确定数据版本的可见性。
二、隔离性理解
- 读为未提交(当前读):一个事务还没有提交时,它做的变更就能被其它事务读取到,总是读取已经提交完成的最新版本;读trx_id最大的数据;
- 读提交:一个事务提交以后,它做的变更才能被其它事务看到;
- 可重复读:一个事务执行过程中看到的数据,总是跟这个事务启动时候看到的数据一致。未提交的事务中的变更,其它事务是不可见的。
- 串行化:顾名思义是同一行记录,“写”会加“写锁”,读会加“读锁”。当出现读、写锁冲突的时候,后访问的事务执行完成,才能继续执行。
三、数据可见性
- 脏读:事务还未提交时,它做的变更就能被其它事务读取到,可能导致其它线程读取到的数据,与最终落库结果有差异;
- 可重复读:在一个事务看到(普通查询“快照读”)的数据是一致的;
- 幻读:在一个事务中,“当前读”看到的数据前后有新数据增加(新插入的行数据),导致不一致;为了解决幻读问题, innoDB引入了间隙锁(Gap Lock),顾名思义 ,是锁住两个值的间隙;
备注:“当前读” 只是在 可重复读隔离级别才有,因为 在其它事务隔离级别下,其它事务提交或未提交时直接 普通查询“快照读”就能读取到最新的数据。在可重读读隔离级别下 update、 for update 悲观锁 等情况会有“当前读”;
还没有评论,来说两句吧...