首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql一致性非锁定读

基础概念

MySQL的一致性非锁定读(Consistent Non-Locking Read)是指在读取数据时,不会对数据进行加锁,从而避免了其他事务因为等待锁释放而产生的阻塞。这种读取方式可以提高数据库的并发性能,因为它允许其他事务同时对同一数据进行读取或修改。

相关优势

  1. 提高并发性能:由于不需要加锁,多个事务可以同时读取同一数据,减少了事务之间的等待时间。
  2. 减少锁冲突:避免了因为锁竞争导致的性能下降和死锁问题。
  3. 简化事务管理:事务管理更加简单,不需要考虑复杂的锁机制。

类型

MySQL中的非锁定读主要有两种实现方式:

  1. 快照读(Snapshot Read):在可重复读(REPEATABLE READ)隔离级别下,MySQL会使用多版本并发控制(MVCC)来实现快照读。读取的数据是事务开始时的版本,即使其他事务对数据进行了修改,当前事务仍然可以看到事务开始时的数据。
  2. 当前读(Current Read):包括SELECT ... FOR UPDATE和SELECT ... LOCK IN SHARE MODE等语句,这些语句会读取最新的数据,并且会对数据进行加锁,以防止其他事务修改。

应用场景

一致性非锁定读适用于以下场景:

  1. 高并发读取:当系统需要处理大量并发读取请求时,使用非锁定读可以提高系统的吞吐量。
  2. 读多写少:当系统中读取操作远多于写入操作时,非锁定读可以显著提高性能。
  3. 实时性要求不高:对于一些对数据实时性要求不高的场景,可以使用非锁定读来提高系统的并发能力。

遇到的问题及解决方法

问题:为什么在某些情况下,快照读读取到的数据不是最新的?

原因:快照读读取的是事务开始时的数据版本,如果在事务开始后有其他事务对数据进行了修改,当前事务仍然会看到事务开始时的数据。

解决方法

  1. 使用当前读:如果需要读取最新的数据,可以使用SELECT ... FOR UPDATE或SELECT ... LOCK IN SHARE MODE等当前读语句。
  2. 调整隔离级别:如果业务允许,可以将隔离级别调整为读已提交(READ COMMITTED),这样快照读会读取到最新的已提交数据。

问题:非锁定读可能会导致幻读问题,如何解决?

原因:幻读是指在一个事务中多次读取同一范围的数据,由于其他事务插入了新的数据,导致每次读取的结果不一致。

解决方法

  1. 使用更高隔离级别:将隔离级别调整为串行化(SERIALIZABLE),这样可以避免幻读问题,但会降低并发性能。
  2. 使用锁:在读取数据时,使用SELECT ... FOR UPDATE等语句对数据进行加锁,防止其他事务插入新数据。

示例代码

代码语言:txt
复制
-- 快照读示例
START TRANSACTION;
SELECT * FROM users WHERE id = 1;
-- 其他事务可以同时读取或修改数据
COMMIT;

-- 当前读示例
START TRANSACTION;
SELECT * FROM users WHERE id = 1 FOR UPDATE;
-- 其他事务需要等待当前事务释放锁才能读取或修改数据
COMMIT;

参考链接

通过以上内容,您可以更好地理解MySQL一致性非锁定读的相关概念、优势、类型、应用场景以及常见问题及其解决方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

MySQL探秘(六):InnoDB一致性非锁定读

一致性非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过多版本控制(MVVC)读取当前数据库中行数据的方式。...上图直观地展现了InnoDB一致性非锁定读的机制。之所以称其为非锁定读,是因为不需要等待行上排他锁的释放。快照数据是指该行的之前版本的数据,每行记录可能有多个版本,一般称这种技术为行多版本技术。...一致性非锁定读是InnoDB默认的读取方式,即读取不会占用和等待行上的锁。但是并不是在每个事务隔离级别下都是采用此种方式。此外,即使都是使用一致性非锁定读,但是对于快照数据的定义也各不相同。  ...在事务隔离级别READ COMMITTED和REPEATABLE READ下,InnoDB使用一致性非锁定读。然而,对于快照数据的定义却不同。...在READ COMMITTED事务隔离级别下,一致性非锁定读总是读取被锁定行的最新一份快照数据。而在REPEATABLE READ事务隔离级别下,则读取事务开始时的行数据版本。

1K20

MySQL探秘(六):InnoDB一致性非锁定读

一致性非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过多版本控制(MVVC)读取当前数据库中行数据的方式。...一致性非锁定读示意图  上图直观地展现了InnoDB一致性非锁定读的机制。之所以称其为非锁定读,是因为不需要等待行上排他锁的释放。...一致性非锁定读是InnoDB默认的读取方式,即读取不会占用和等待行上的锁。但是并不是在每个事务隔离级别下都是采用此种方式。此外,即使都是使用一致性非锁定读,但是对于快照数据的定义也各不相同。  ...在事务隔离级别READ COMMITTED和REPEATABLE READ下,InnoDB使用一致性非锁定读。然而,对于快照数据的定义却不同。...在READ COMMITTED事务隔离级别下,一致性非锁定读总是读取被锁定行的最新一份快照数据。而在REPEATABLE READ事务隔离级别下,则读取事务开始时的行数据版本。

42910
  • MySQL探秘(六):InnoDB一致性非锁定读

    一致性非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过多版本控制(MVVC)读取当前数据库中行数据的方式。...一致性非锁定读示意图  上图直观地展现了InnoDB一致性非锁定读的机制。之所以称其为非锁定读,是因为不需要等待行上排他锁的释放。...一致性非锁定读是InnoDB默认的读取方式,即读取不会占用和等待行上的锁。但是并不是在每个事务隔离级别下都是采用此种方式。此外,即使都是使用一致性非锁定读,但是对于快照数据的定义也各不相同。  ...在事务隔离级别READ COMMITTED和REPEATABLE READ下,InnoDB使用一致性非锁定读。然而,对于快照数据的定义却不同。...在READ COMMITTED事务隔离级别下,一致性非锁定读总是读取被锁定行的最新一份快照数据。而在REPEATABLE READ事务隔离级别下,则读取事务开始时的行数据版本。

    48640

    三分钟小短文:一致性非锁定读与一致性锁定读

    台上三分钟,台下三小时,兄弟们,今天咱们花三分钟了解下数据库中的两种读(select)操作:一致性非锁定读 和 一致性锁定读 一致性非锁定读 一致性非锁定读是什么?...并且,即使都是使用非锁定的一致性读,它俩对于快照数据的定义也各不相同: 在 READ COMMITTED 事务隔离级别下,总是读取行的最新版本;如果行被锁定了,非一致性读不会因此去等待行上锁的释放,而是去读取该行版本的最新一个快照...也就是说,在事务 1 刚开始的时候,id = 1 的数据行是什么样,现在读到的就是什么样的: 可以结合下面这张图来回顾下上述的过程: 一致性锁定读 其实从名字上也能看出来,非一致性锁定读适用于对数据一致性要求不是很高的情况...,比如在 READ COMMITTED 隔离级别下,即使行被锁定了,非一致性读也可以读到该行版本的最新一个快照。...也即,非锁定读机制极大地提高了数据库的并发性。 而一致性锁定读适用于对数据一致性要求比较高的情况,这个时候我们需要对读操作进行加锁以保证数据逻辑的一致性。

    47020

    MySQL事务(二)事务隔离的实现原理:一致性读

    今天我们来学习一下MySQL的事务隔离是如何实现的。如果你对事务以及事务隔离级别还不太了解的话,这里左转。 好的,下面正式进入主题。事务隔离级别有4种:读未提交、读提交、可重复读和串行化。...而事务B是当前读,而且必须要加锁,因此被锁住了,必须等到事务C'释放这个锁,才能继续它的当前读。 到这里,把一致性读、当前读和行锁串起来了。 小结 本节问题,事务的可重复读隔离级别是如何实现的?...可重复读的核心就是一致性读;而事务更新数据的时候,只能用当前读。如果当前的记得的行锁被其他事务占用的话,就需要进入锁等待。...读提交 读提交的实现方式跟可重复读类似,它们最主要的区别是: 在可重复读隔离级别下,只需要在事务开始的时候创建一致性视图,之后事务里的其他查询都共用这个一致性视图; 在读提交隔离级别下,每个语句执行前都会重新算出一个新的视图...MySQL事务隔离级别的实现原理

    39040

    MySQL 数据库锁定机制

    MySQL 锁定机制简介 各存储引擎使用三种类型锁定机制 行级锁定(row-level) 表级锁定(table-level) 页级锁定(page-leve) : 页级锁定介于行级锁定与表级锁定之间...MySQL数据库中 表级锁定主要是 MyISAM、Memory、CSV 等一些非事务性存储引擎,使用行级锁定主要是 InnoDB 存储引擎和 NDB Cluster 存储引擎,页级锁定主要是BerkeleyDB...MyISAM 表级锁定主要分为两种类型 读锁定,一个新客户端在申请获取读锁定资源的时候,需要满足两个条件: 请求锁定的资源当前没有被写锁定 写锁定等待队列 (Pending write-lock queue...MySQL中主要分4中队列来维护这两种锁定:两个存放当前正在锁定的读和写锁定信息,另外两个存放等待中的读写锁定西信息,如下: Current read-lock queue ( lock->read)...InnoDB 的行级锁定分为四种类型 共享锁 (有叫做:读锁) 允许一个事务去读一行,阻止其他事务获得相同数据的排它锁。

    1.3K20

    MySQL 数据库锁定机制

    MySQL数据库中 表级锁定主要是 MyISAM、Memory、CSV 等一些非事务性存储引擎,使用行级锁定主要是 InnoDB 存储引擎和 NDB Cluster 存储引擎,页级锁定主要是BerkeleyDB...MyISAM 表级锁定主要分为两种类型 读锁定,一个新客户端在申请获取读锁定资源的时候,需要满足两个条件: 请求锁定的资源当前没有被写锁定 写锁定等待队列 (Pending write-lock queue...MySQL中主要分4中队列来维护这两种锁定:两个存放当前正在锁定的读和写锁定信息,另外两个存放等待中的读写锁定西信息,如下: Current read-lock queue ( lock->read)...InnoDB 的行级锁定分为四种类型 共享锁 (有叫做:读锁) 允许一个事务去读一行,阻止其他事务获得相同数据的排它锁。...原文链接:MySQL 数据库锁定机制

    2.3K160

    关于数据库锁的那些事

    Innodb 面对锁是怎么读取的 一致性的非锁定读 我们知道 当我们频繁 更新数据 加排他锁 (X Lock) 的时候, 因为其锁的不兼容性, 会严重影响正常的数据查询性能....一致性的非锁定读 是指 InnoDB 存储引擎通过行多版本控制(multi versioning)的方式来读取当前执行时间数据库中行的数据。...相反地,InnoDB 存储引擎会去读取行的一个快照数据 一致性非锁定读的快照数据其实是读的 undo 数据(undo是用来回滚事务中的数据), 没有额外的锁操作, 所以读取速度非常的快....默认级别) select 使用的是 一致性的非锁定读....思考: 一致性的非锁定读 解决了什么问题? 带来了什么问题一致性锁定读 在一些强一致的场景, 我们是希望让用户读取到的永远是最新的数据. 这时候, 我们需要使用 一致性锁定读 的场景.

    51810

    innodb锁机制探究(一)

    yeyztest 13:25:13>>select * from information_schema.innodb_lock_waits\G Empty set, 1 warning (0.00 sec) 一致性非锁定读...一致性非锁定读是指innodb通过行记录的多版本控制来读取当前执行时间数据库中行的数据,如果读取的行正在执行delete或者update操作,则会读取一个该行记录的一个快照数据。...通过上面的描述,我们可以发现,一致性非锁定读提高了数据库的并发性,因为读操作不用等待锁的释放。...一致性锁定读 上面说到了 一致性非锁定,下面我们看看一致性锁定读,非锁定读我们知道读取的是数据的快照,可能不是数据当前的真是内容,而锁定读读取的就是当前数据的真是内容。...所以,一致性锁定读,必须写在事务里面才管用,否则这样的语句不会获得这一行记录的锁。

    34610

    MySQL 面试必备:又一神器“锁”,不会的在面试都挂了

    4 一致性非锁定读和一致性锁定读 一致性锁定读(Locking Reads) 在一个事务中查询数据时,普通的SELECT语句不会对查询的数据进行加锁,其他事务仍可以对查询的数据执行更新和删除操作。...一致性非锁定读 一致性非锁定读(consistent nonlocking read) 是指InnoDB存储引擎通过多版本控制(MVVC)读取当前数据库中行数据的方式。...所以,非锁定读机制大大提高了数据库的并发性。 ? 来自网络:侵权删 一致性非锁定读是InnoDB默认的读取方式,即读取不会占用和等待行上的锁。...在事务隔离级别READ COMMITTED和REPEATABLE READ下,InnoDB使用一致性非锁定读。 然而,对于快照数据的定义却不同。...在READ COMMITTED事务隔离级别下,一致性非锁定读总是读取被锁定行的最新一份快照数据。而在REPEATABLE READ事务隔离级别下,则读取事务开始时的行数据版本。

    60710

    MySQL 面试必备:又一神器“锁”,不会的在面试都挂了

    4 一致性非锁定读和一致性锁定读 一致性锁定读(Locking Reads) 在一个事务中查询数据时,普通的SELECT语句不会对查询的数据进行加锁,其他事务仍可以对查询的数据执行更新和删除操作。...一致性非锁定读 一致性非锁定读(consistent nonlocking read) 是指InnoDB存储引擎通过多版本控制(MVVC)读取当前数据库中行数据的方式。...所以,非锁定读机制大大提高了数据库的并发性。 ? 来自网络:侵权删 一致性非锁定读是InnoDB默认的读取方式,即读取不会占用和等待行上的锁。...在事务隔离级别READ COMMITTED和REPEATABLE READ下,InnoDB使用一致性非锁定读。 然而,对于快照数据的定义却不同。...在READ COMMITTED事务隔离级别下,一致性非锁定读总是读取被锁定行的最新一份快照数据。而在REPEATABLE READ事务隔离级别下,则读取事务开始时的行数据版本。

    39100

    Mysql 数据库 超时和锁定

    MySQL 提供了一个加全局读锁的方法 flush tables with read lock; # 加锁 unlock tables; #解锁 当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞...加读锁(共享锁):所有人只能读不能写 加写锁(排他锁):加锁的人可以写可以读 lock table t1 read, t2 write unlock tables lock tables 语法除了会限制别的线程的读写外...MDL 的作用是并发情况下维护数据的一致性,保证读写的正确性。...(避免加字段删字段导致查询结果异常) 因此,在 MySQL 5.5 版本中引入了 MDL,当对一个表做增删改查操作的时候,加 MDL 读锁; 当要对表做结构变更操作的时候,加 MDL 写锁。...MDL 是并发情况下维护数据的一致性,在表上有事务的时候,不可以对元数据经行写入操作,并且这个是在server层面实现的 行锁 MySQL 的行锁是在引擎层由各个引擎自己实现的。

    5.1K20

    MySql 三大知识点——索引、锁、事务

    知道了索引的设计,我们能够知道另外一些信息: MySql 的主键不能太大,如果使用 UUID 这种,将会浪费 B+ 树的非叶子节点。...,并且锁定记录本身, MySql 防止幻读,就是使用此锁实现) 4....默认的读操作,上锁吗? 默认是 MVCC 机制(“一致性非锁定读”)保证 RR 级别的隔离正确性,是不上锁的。...可以选择手动上锁:select xxxx for update (排他锁); select xxxx lock in share mode(共享锁),称之为“一致性锁定读”。...这里有个注意点,关于幻读,在数据库规范里,RR 级别会导致幻读,但是,由于 Mysql 的优化,MySql 的 RR 级别不会导致幻读:在使用默认的 select 时,MySql 使用 MVCC 机制保证不会幻读

    88340

    MySql 三大知识点——索引、锁、事务

    知道了索引的设计,我们能够知道另外一些信息: MySql 的主键不能太大,如果使用 UUID 这种,将会浪费 B+ 树的非叶子节点。...,并且锁定记录本身, MySql 防止幻读,就是使用此锁实现) 4....默认的读操作,上锁吗? 默认是 MVCC 机制(“一致性非锁定读”)保证 RR 级别的隔离正确性,是不上锁的。...可以选择手动上锁:select xxxx for update (排他锁); select xxxx lock in share mode(共享锁),称之为“一致性锁定读”。...一张经典的图: 这里有个注意点,关于幻读,在数据库规范里,RR 级别会导致幻读,但是,由于 Mysql 的优化,MySql 的 RR 级别不会导致幻读:在使用默认的 select 时,MySql 使用

    74220

    MySQL InnoDB 锁和事务

    锁 标准行级锁:共享锁和排它锁 特殊的锁:意向锁 一致性非锁定性读: 指InnoDB存储引擎通过行多版本控制的方式读取当前执行时间数据库中行的数据,如果读取的行正在执行delete或者update...但对于快照数据的定义却不一样,READ COMMITTED总是读取最新的一份快照数据,而REPEATABLE READ读取的是事务开始时的快照数据 一致性锁定读: 在某些情况下,用户需要显示的对数据库读取操作进行加锁以保证数据逻辑的一致性...,而这要求数据库支持加锁语句,innodb对于select语句支持两种一致性的锁定读操作: select … for update 对读取的行加一个X锁,其他事务不能对已锁定的行加任何锁 select...… lock in share mode 对读取的行加一个S锁,其他事务可以向已锁定的行加S锁,但是加X锁会阻塞 对于一致性非锁定性读,即使读取的行已经加了X锁,也是可以被读取的。...) 否 是 是 可重复读(repeatable-read) 否 否 是 串行化(serializable) 否 否 否 参考: 高性能MySQL 第3版 MySQL技术内幕-InnoDB存储引擎 第2

    81630

    MySQL是怎么读数据的——多版本并发控制

    我在之前的文章中(【MySQL入门】之MySQL数据库的锁机制(一),【MySQL入门】之MySQL数据库的锁机制(二))介绍了MySQL的全局锁、表锁和行锁,今天我在来介绍下MySQL的一致性非锁定读...、一致性锁定读。...一致性非锁定读(Consistent nonlocking reads) 一致性非锁定读也叫快照(snapshot read),是指当事务进行查询时,innodb存储引擎利用MVCC技术可以查看过去某个时间点的快照数据...一致性锁定读(Locking Reads) 在同一个事务中如果你先查询然后再更新数据时,由于InnoDB引擎的select操作使用一致性非锁定读,其他事务可以修改或者删除刚才查询的行数据,这样就无法保证数据的一致性了...悲观锁主要是依靠数据库自身的锁机制实现,比如上面我们提到的一致性锁定读,其实就是用了悲观锁的思想。 MySQL的悲观锁通常用Select … for update和SELECT ...

    78920
    领券