作者:从了良后 | 来源:互联网 | 2020-09-14 07:11
mysql的隔离级别的实现方法:当隔离级别为未提交读时,所有的读不加锁,读到的数据都是最新的数据,性能最好,所有的写加行级锁,写完释放。当隔离级别为串行化时,读写都会加锁。
mysql的隔离级别的实现方法:当隔离级别为未提交读时,所有的读不加锁,读到的数据都是最新的数据,性能最好,所有的写加行级锁,写完释放。当隔离级别为串行化时,读写都会加锁。
4、如果上面判断都是不可见的,则读取undo中该行记录的上一条行记录,继续进行判断。
而对于RC级别的语句级快照和RR级别的事务级快照的之间的区别,其实是由read_view生成的时机来实现的。
RC级别在执行语句时,会先关闭原来的read_view,重新生成新的read_view。而RR级别的read_view则只在事务开始时创建的。所以RU级别每次获取到的都是最新的数据,而RR级别获取到的是事务开始时的数据。
(3)值得注意的是: 在上面的可见性判断中,虽然逻辑是一样的,但是实际意义上是有区别的:
在第二步中,对于RC级别来说,low_limit_id是执行语句时已出现的最大事务id+1,可以认为在执行语句时,是不存在事务会比low_limit_id要大,所以大于low_limit_id的事务都是不可见的。
而对于RR级别来说,low_limit_id是当前事务开始时已出现的最大事务+1(也可以认为是当前事务的id+1,因为在创建当前事务时,当前事务的id最大),大于low_limit_id的事务表示是在该事务开始后创建的,所以对RR级别是不可见。
在第三步中,对于RC级别来说,只要DB_TRX_ID不在活跃链表中,则无论DB_TRX_ID是否大于事务id,RC都是可见的。
而对于RR级别来说,因为low_limit_id就是当前事务id+1,可以认为小于low_limit_id的事务都是在当前事务创建前出现的,所以也只需要简单判断DB_TRX_ID是否在活跃链表中。
串行化(serializable):读写都会加锁
以上就是mysql的隔离级别是如何实现的的详细内容,更多请关注 第一PHP社区 其它相关文章!