美文网首页Mysql学习
一致性非锁定读和一致性锁定读

一致性非锁定读和一致性锁定读

作者: Sandy_678f | 来源:发表于2019-07-05 15:04 被阅读0次

一致性非锁定读(consistent nonlocking read)
一致性非锁定读是指InnoDB存储引擎通过多版本控制(multi versionning)的方式来读取当前执行时间数据库中的行数据。
如果读取的行正在执行update或delete操作,这时读取操作不会因此等待行上的锁释放。相反的,InnonDB会去读取行上的一个快照数据。
快照数据是指该行之前版本的数据,该实现是通过undo page来完成。而undo用来事务中的回滚数据,因此快照数据没有额外的开销。
快照其实是当前行数据之前的历史版本,每行记录可能有多个版本的快照数据,一般称这种技术叫多版本并发控制(MVCC,Multi Version Concurrency Control)
非锁定读提高了数据库的并发性,在InnonDB存储引擎下,这是默认的读写方式,即读不会占用和等待表上的锁。
但是在不同的事务隔离级别下,读取的方式还有些不同。并不是都采用非锁定的一致性读,此外对快照的定义也不相同。

image.png

即快照有两个级别:
语句级
针对于Read committed隔离级别
事务级别
针对于Repeatable read隔离级别

一致性锁定读(consistent locking read)
有些情况下为了保证数据的一致性,需要对select的操作加锁。InnonDB存储引擎对于select语句支持两种一致性的锁定读。

  1. select …… for update
  2. select …… lock in share mode

select …… for update是对读取的记录加一个X锁,select …… lock in share mode是对读取的记录加一个S锁。

即使被读取的行被加了一致性锁定读,如果有另一个一致性非锁定读的操作来读取该行数据是不会阻塞的,读取的是改行的快照版本。

SELECT …… FOR UPDATE和SELECT …… LOCK IN SHARE MODE必须在一个事务中,当一个事务提交了,锁就释放了。因此在使用上述两个SELECT锁定语句时,必须开启事务。

相关文章

网友评论

    本文标题:一致性非锁定读和一致性锁定读

    本文链接:https://www.haomeiwen.com/subject/rxfehctx.html