mysql 默认事务隔离等级
由图可见,mysql 默认是使用 RR 的隔离方式执行的
我们创建了一个表用于测试,并插入了5条测试数据:
Read Uncommitted
首先我们将当前 session 的隔离级别设置为 READ UNCOMMITTED,并开启一个新的事务,然后执行一次查询,可以看到查询到了原始的数据
这时,我们打开一个新的终端,同样开启一个新的事务,并执行一条 update 语句更新数据
接下来,我们切换到原来的终端,重新执行查询:
我们发现数据发生了变化,然而执行 update 语句的终端并没有提交事务,我们看到出现了脏堵现象
Read Committed
与上面一样,我们首先将当前 session 的隔离级别设置为 READ COMMITTED,然后开启一个新事务,并执行一次查询,可以看到查询到了原始数据
然后,在另一个终端中,我们同样开启一个新事务并执行一条 update 语句更新数据
在更新事务尚未提交时,我们回到开始的终端,重新执行查询
可以看到,脏读问题已经不存在了
那么,接下来,我们在提交另一个终端中的更新事务,并回到开始的终端中重新执行查询:
我们看到,开始的终端里查询到的数据发生了变化,出现了不可重复读的问题
同时我们在另一终端中开启新的事务,插入一条数据并提交事务,然后我们再在原来的终端中查询数据
我们看到,原来的终端的查询结果看到了新增的数据,出现了幻读问题
Repeatable Read
同样的,我们切换到 REPEATABLE READ 隔离方式,然后查询原始数据:
此时,我们在另一个终端中执行插入并提交:
然后回到开始的终端查询:
可以看到,幻读的问题已经被解决了
Serializable
串行化的隔离方式会明显降低事务的处理效率,因此不建议使用,由于他保证事务的严格传行执行,所以可以保证上述问题的避免,这里我们不做实践了