MySQL数据库事务MVCC

Innodb只是借了MVCC这个名字,提供了读的非阻塞而已。
https://m.imooc.com/article/17290
1.单纯加锁是怎么实现 read committed 的?

从此隔离级别效果入手:事务只能读其他事务已提交的的记录。
数据库事务隔离级别的实现,InnoDB 支持行级锁,写时加的是行级排他锁(X lock),那么当其他事务访问另一个事务正在update (除select操作外其他操作本质上都是写操作)的同一条记录时,事务的读操作会被阻塞。所以只能等到记录(其实是索引上的锁)上的排他锁释放后才能进行访问,也就是事务提交的时候。这样确实能实现read commited隔离级别效果。
数据库这样做确实可以实现 事务只能读其他事务已提交的的记录 的效果,但是这是很低效的一种做法,为什么呢?因为对于大部分应用来说,读操作是多于写操作的,当写操作加锁时,那么读操作全部被阻塞,这样会导致应用的相应能力受数据库的牵制。

2.真实的演示情况是什么样子的?

看如下操作:
1.开启两个客户端实例,设置事务隔离级别为read committed,并各自开启事务。

set transaction isolation level read committed;
set autocommit = 0;
begin;
2.客户端1做更新操作:

update test set name = ‘测试’ where id =32;
结果如下图所示:
屏幕快照

3.客户端2做查询操作:

select name from test where id = 32;
结果如下所示:
屏幕快照

这时估计你有疑问了,正在 被客户端1 upate 的记录,客户端2还能无阻塞的读到,而且读到的是未更改之前的数据。
那就是 InnoDB 的辅助打得好,因为内部使用了 MVCC 机制,实现了一致性非阻塞读,大大提高了并发读写效率,写不影响读,且读到的事记录的镜像版本。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值