参考别人文章,留作记录,方便以后查阅
InnoDB隔离级别是如何实现的
一、mysql多事务并发的场景下会出现的问题:
1.脏读
事务A执行过程中的一次查询,读到了事务B修改但并未提交的数据,
后来B回滚,导致A读到了错误数据,这是脏读。
2.不可重复读
事务A两次相同查询的间隔中,事务B修改了这些记录的数据并提交,
导致A两次读到的记录数据不一致,这是不可重复读。
3.幻读
事务A两次相同查询的间隔中,事务B插入了符合条件的记录并提交,
导致A两次读到的记录条数不一致,这是幻读。
二、隔离级别
1.读未提交(Read Uncommitted)
一般不会用于实际项目。
2.读已提交(Read Committed)
大部分数据库的默认隔离级别,如oracle、sql server等,但是不包括mysql InnoDB。
3.可重复读(Repeatable Read)
mysql InnoDB默认的隔离级别。
4.可串行化(Serializable)
事务隔离的最高级别,会使数据库的并发性能大幅下降,现实中应用很少。
各隔离级别对应的问题:
三、常见锁
1.乐观锁和悲观锁
它们不是真实存在的锁,只是一种机制或者说是理论。
悲观锁,它总是假设最坏的情况,每次去访问数据都认为别人会修改,
所以每次访问数据都会加锁,Java中synchronized就是悲观锁的实现。
乐观锁,它总是假设最好的情况,每次去访问数据都认为别人不会修改,
只会在更新的时候去判断一下数据有没有被修改,如果没有被修改才更新,否则重试或失败。
2.共享锁(Shared Lock)也叫读锁或S锁
若事务A对数据对象a加上S锁,则事务A只能读a;
其他事务还可以再对a加S锁,却不能加X锁,直到A释放a上的S锁;
这样保证了其他事务可以读a,但在A释放a上的S锁之前不能对a做任何修改。
3.排它锁(Exclusive Lock)也叫写锁或X锁
若事务A对数据对象a加上X锁,则事务A可以读或写a,其他事务则不可以再对a加任何锁。
4.行锁(Record Lock)
锁住对应的行,使其它事务无法修改这些数据,但是无法限制insert操作。
5.间隙锁(Gap Lock)
锁住一个范围,使其它事务无法在该范围内插入数据。
参考文章
「CaptainCats」的原创文章: InnoDB的隔离级别是如何实现的