广告
返回顶部
首页 > 资讯 > 数据库 >一致性非锁定读与一致性锁定读的大数据分析
  • 585
分享到

一致性非锁定读与一致性锁定读的大数据分析

2024-04-02 19:04:59 585人浏览 薄情痞子
摘要

本篇文章为大家展示了一致性非锁定读与一致性锁定读的大数据分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。背景innodb存储引擎实现了两种标准的行级锁:S锁和X锁

本篇文章为大家展示了一致性非定读与一致性锁定读的大数据分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

背景

innodb存储引擎实现了两种标准的行级锁:S锁和X锁,S锁被称为共享锁,允许事务读一行数据,X锁被称为排它锁,允许事务删除或更新一行数据。

一致性非锁定读指的是如果一条记录被加了X锁,其他事务还能读取这条记录。

一致性锁定读指的是一个事务可以通过SELECT语句给某条记录加X锁或者X锁。

一个小栗子

我们假设有一个表和两个事务,表名字为mytest,事务名字为t1和t2:

t1t2t3t4
abbbbccc

t1和t2的执行时序如下:

一致性非锁定读与一致性锁定读的大数据分析

这里我先抛出两个问题:

  • 上面Mark A处显然t1已经给记录加了X锁,并且在事务内修改了数据,此时t2看到的数据是什么?

  • 上面Mark B处事务t1已经提交此时t2看到的数据是什么?

行多版本控制

行多版本将的是innodb为每个行记录存储了多个版本,记住,这里是多个版本不是两个版本,在刚开始接触多版本的时候,我的疑问是innodb对每个行要存储多个版本是多么浪费存储空间呀?然而进一步了解,原来所谓的多版本只是innodb聪明地撒了个谎,多个版本是通过undo日志实现的,这里可以理解为既然undo日志包括了所有用来恢复历史版本数据的信息,那么我们只要将“不同版本”指针指向不同时间节点的undo日志即可,这样读取的时候通过对不同时间节点的undo日志进行恢复从而得到不同的版本数据。同时对于undo日志的读取是不需要加锁的,因此这极大地提高了数据库并发性。

这里回答了上面的***个问题:t2此时看到的应该是历史版本的数据,也就是t1修改之前的数据,如下:

Mysql> select * from mytest where t2='bb';  +------+------+------+------+  | t1 | t2 | t3 | t4 |  +------+------+------+------+  | a | bb | bb | ccc |  +------+------+------+------+  1 row in set (0.00 sec)  READ COMMITTED 与 REPEATABLE READ

这里复习一下sql标准定义的四个隔离级别分别为:

  • READ UNCOMMITTED

  • READ COMMITTED

  • REPEATABLE READ

  • SERIALIZABLE

innodb默认的隔离级别为REPEATABLE READ且使用next key locking技术解决的幻读的问题,READ  COMMITTED值的是一个事务可以读取其他事务已经提交的数据,而REPEATABLE  READ要求一个事务在事务内可以重复读取一条记录,因此上面第二个问题的答案是此时t2看到的是什么跟此时数据库的隔离级别有关系,比如此时的隔离级别为:

mysql> select @@tx_isolation;  +-----------------+  | @@tx_isolation |  +-----------------+  | REPEATABLE-READ |  +-----------------+  1 row in set (0.00 sec)

因此t2在Mark B的地方看到的应该是老数据:

mysql> select * from mytest where t2='bb';  +------+------+------+------+  | t1 | t2 | t3 | t4 |  +------+------+------+------+  | a | bb | bb | ccc |  +------+------+------+------+  1 row in set (0.00 sec)  mysql>

如果此时的事务隔离级别为READ COMMITTED,则t2在Mark B处看到的应该是新数据。

一致性锁定读

一致性非锁定读的情况下即使记录因为UPDATE而被加了X锁,其他事务仍然能够读取记录,不会阻塞。而如果一个事务希望在读取的时候就把记录锁住,不允许其他事务进行修改应该怎么做呢?那就是SELECT  … FOR UPDATE,SELECT … FOR UPDATE显式地给一条记录加X锁,因此其他事务不能获取该记录的任何锁。我们也可以使用SELECT …  LOCK IN SHARE MODE来给记录显式地加S锁,因此其他事务能够获取该记录的S锁而不能获取该记录的X锁,这两种语句都是有特定的应用场景的。

总结一下,一致性非锁定读讲的是一条记录被加了X锁其他事务仍然可以读而不被阻塞,是通过innodb的行多版本实现的,行多版本并不是实际存储多个版本记录而是通过undo实现。一致性锁定读讲的是我可以通过SELECT语句显式地给一条记录加X锁从而保证特定应用场景下的数据一致性。

上述内容就是一致性非锁定读与一致性锁定读的大数据分析,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: 一致性非锁定读与一致性锁定读的大数据分析

本文链接: https://www.lsjlt.com/news/70613.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一致性非锁定读与一致性锁定读的大数据分析
    本篇文章为大家展示了一致性非锁定读与一致性锁定读的大数据分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。背景innodb存储引擎实现了两种标准的行级锁:S锁和X锁...
    99+
    2022-10-19
  • 怎么理解Innodb一致性非锁定读
    这篇文章主要讲解了“怎么理解Innodb一致性非锁定读”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Innodb一致性非锁定读”吧!一致性非锁定读指...
    99+
    2022-10-19
  • 数据库的读一致性分析
    前言提起数据库的事务,我们就会想到ACID特性:A:Atomicity 原子性    事务中包含的各种操作,要么一起成功,要么全部失败C:Consistency 一致性  事务...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作