前沿:Mysql的事物隔离级别在很多面试中会被问到,既然会被高频问到,一定是面试官在开发中遇到了很多问题或者说这些知识是开发中必备的。下面我解释下我们写代码中会遇到的问题。
- 场景一:两个数据库链接,A和B。当A去更新某一条数据,但是并未提交,但是B去查询这条数据的时候已经查询到A更新且未提交的数据了。这在实际开发中是不允许的。这种情况叫脏读。
- 场景二:两个事物,A和B,当A事物中频繁的去查询某个用户的金额的时候,在B中去修改了这个用户的金额,那么当A第一次去查询的金额和第二次去查询的金额不一致,一个事物中对同一条数据查询的结果不一致。试想,我们作为程序员,出现这种情况,我们的代码怎么出处理?这种叫做不可重复读。
- 场景三:两个事物,A和B,当A去查询某个表的数据条数,B去insert或者del这个表的数据的时候。A查询出来的结果一会多一会少。就好像是幻觉一样,这种情况叫幻读。
基于以上的三种场景,Mysql在处理的时候给我们提供了几种选择:
事物隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(read-uncommitted) | 是 | 是 | 是 |
读已提交(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
首先明确一点,事物的隔离级别是基于Connection,那么我们查看connection默认的隔离级别的方式:
我们看到默认的事物隔离级别是(可重复读)repeatable-read。