mysql如何实现隔离性_Mysql的隔离以及实现

Mysql的隔离级别有四个

1、读未提交

2、读提交

3、可重复读 RR

4、串行读

隔离的实现

每次修改对应一个事务ID:row trx id,还对应一个undo log,因此undo log和row trx id是一一对应的。

cc644123bd837e5ea817069d8435fe6d.png

当我们开始一个事务的时候,会生成一个事务的snap shot,将当前正在进行的没有提交的事务id存放到一个数组中。这个数组是静态的,可称之为视图。致性InnoDB就是用这个数组来实现隔离的,从而保证了一致性读。

数组中最大的ID是自己,表示高水位;最小的是事务id是低水位。

对于可重复读,小于低水位的数据说明在创建事务之前就已经提交,因此对于本事务是可见的;

大于高水位的数据是不可见的,是本次事务创建后才创建的事务修改的数据,因此对于本事务是不可见的;

如果处于低水位和高水位之前的事务修改的数据,则要看该事务id是否落在了视图创建是的事务数组中,如果落在了里面,表示虽然该事务早于我之前创建,但是晚于我事务启动时提交,因此是不可见的。如果没有落在事务id数组中,那么表示本事务创建时,该事务已经提交,因此是可见的。

以上几个原则,保证了一致性读。

7a733cdd5ec9c6259508a58abd0d8ff1.png

693ad6ab5ec6854a634a47c22b7b1247.png

更新操作的可见性

数据更新时,必须是在当前的最新的数据上修改,否则某些事务的更新就会被覆盖。因此,事务中的更新操作必须是当前读。这就和我们上面说的一致性读产生了矛盾,或者说是有别于一致性读。此时就要引入行锁,当数据修改,但没有提交时,行锁是一直持有的。因此其他事务的更新操作是会被阻塞的。因此,行锁保证了当前读,也就保证了数据的修改不会被覆盖。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值