mysql锁级别_mysql 锁机制与四种隔离级别

mysql 默认事务隔离等级

a7e501062a5147cdb5a1228596dd5933.png?id=3377548&v=1

由图可见,mysql 默认是使用 RR 的隔离方式执行的

我们创建了一个表用于测试,并插入了5条测试数据:

68536aa2b9f59163525eeb8fa46d6636.png?id=3377549&v=1

Read Uncommitted

首先我们将当前 session 的隔离级别设置为 READ UNCOMMITTED,并开启一个新的事务,然后执行一次查询,可以看到查询到了原始的数据

7312a2bc9d9a4ae1d05198f8301c7809.png?id=3377550&v=1

这时,我们打开一个新的终端,同样开启一个新的事务,并执行一条 update 语句更新数据

b4d68752c48805fa2f9f10caccd9cd28.png?id=3377551&v=1

接下来,我们切换到原来的终端,重新执行查询:

8689ded8dbfcff21b87dee93e8bbcf57.png?id=3377552&v=1

我们发现数据发生了变化,然而执行 update 语句的终端并没有提交事务,我们看到出现了脏堵现象

Read Committed

与上面一样,我们首先将当前 session 的隔离级别设置为 READ COMMITTED,然后开启一个新事务,并执行一次查询,可以看到查询到了原始数据

43eaf26e8a4578fd0431e96bb5d61d2f.png?id=3377553&v=1

然后,在另一个终端中,我们同样开启一个新事务并执行一条 update 语句更新数据

a427d4a8f790cc4af77d424fbe86aa6f.png?id=3377554&v=1

在更新事务尚未提交时,我们回到开始的终端,重新执行查询

812c26febe36d8dd30f16910eccc28a2.png?id=3377555&v=1

可以看到,脏读问题已经不存在了

那么,接下来,我们在提交另一个终端中的更新事务,并回到开始的终端中重新执行查询:

c7cdaaf207e4b1bfac2491784a6cdfc6.png?id=3377556&v=1

f4bd6a840f22893abad724fb2c69552b.png?id=3377557&v=1

我们看到,开始的终端里查询到的数据发生了变化,出现了不可重复读的问题

同时我们在另一终端中开启新的事务,插入一条数据并提交事务,然后我们再在原来的终端中查询数据

0ef297e2ad2f55c8dd90e18db518a938.png?id=3377558&v=1

b8a0573e13656563e259bc1655de0cd2.png?id=3377559&v=1

我们看到,原来的终端的查询结果看到了新增的数据,出现了幻读问题

Repeatable Read

同样的,我们切换到 REPEATABLE READ 隔离方式,然后查询原始数据:

6902db9694de89177a113ac1d745a346.png?id=3377560&v=1

此时,我们在另一个终端中执行插入并提交:

9a4bce39a09f354ae4fda12a7e11e79b.png?id=3377561&v=1

然后回到开始的终端查询:

cbe17f9b627edb29d47abcd06fbb8cd2.png?id=3377562&v=1

可以看到,幻读的问题已经被解决了

Serializable

串行化的隔离方式会明显降低事务的处理效率,因此不建议使用,由于他保证事务的严格传行执行,所以可以保证上述问题的避免,这里我们不做实践了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值