美文网首页
MySQL之乐观锁·MVCC

MySQL之乐观锁·MVCC

作者: 猿来是八阿哥 | 来源:发表于2020-01-10 14:55 被阅读0次
mysql

一、 乐观锁悲观锁

乐观锁悲观锁 是实现并发操作的两种不同的 加锁思想,其中:

  • 乐观锁 假设:操作能成功,不需要事先加锁,只要在真正提交时验证 本次修改是否可以提交,如果不可以提交,则重新尝试更新。
  • 悲观锁 假设:操作不能成功,需要事先对要更新的数据加锁,操作成功后再释放锁,以便其他线程能获得锁。

二、 MVCC 实现思路

MVVC,全名 Multi-Version Concurrency Control,即:多版本并发控制,是 MySQL 的 InnoDB 存储引擎下,repeatable-readread-committed 隔离级别时事务的 乐观锁 的实现方案。大概的实现思路是:

  • 在 InnoDB 的表中增加两个隐藏字段:创建版本号删除版本号
  • 在开启一个事务时,生成一个事务的版本号。
  • 被操作的数据,会临时生成一条新的记录,这条 临时记录 对其他事务时不可见的(事务的隔离性原则)。
  • 如果事务执行成功,会将 更新后的数据事务的版本号 更新到真实的记录上,同时删除临时记录。
  • 因此,在 MVCC 中,其实是不存在 的,既避免了争锁等问题,又保证了并发操作。

三、 MVCC 下的 CURD

1. insert

将当前的事务版本号作为数据的创建版本号。

2. delete

将当前的事务版本号作为数据的删除版本号。

3. update
  • 基于要删除的行,复制出一个临时行。
  • 将当前事务的版本号设置为要删除数据的删除版本号。
  • 将当前事务的版本号设置为临时行的创建版本号。
  • 事务提交时,用临时行替换要删除的行。
4. select

同时满足一下两个条件的数据,会作为查询结果返回:

  • 条件一:数据的创建版本号小于等于事务版本号。即:在事务开始前,数据是存在的。
  • 条件二:数据的删除版本号未定义或者大于事务版本号。即:在事务开始前,数据还没被删除。

四、MVCC 优缺点

1. 优点:
  • 因为 MVCC 中并没有使用锁,从而避免了 的资源浪费和 争锁死锁 等问题。
  • 使用两个隐藏的版本号和事务版本号巧妙的解决了 不可重复读 的问题。
  • 不加锁,速度快。
  • 不冲突。
2. 缺点:
  • 存储了更多数据(两个隐藏的版本号字段)
  • 增加了很多检查工作和处理完后的善后工作。
  • 只能在 repeatable-readread-committed 隔离级别下工作。
  • read-uncommitted 隔离级别下 MVCC 每次都获取到最新的事务版本号。
  • serializable 隔离级别时,读操作锁定了返回的每一行。

相关文章

  • 蚂蚁面试

    1、mysql乐观锁和悲观锁的区别? 乐观锁通过MVCC,版本实现,悲观锁select... for update...

  • MySQL中的锁和并发控制

    综述 对MySQL中并发控制所用到的机制和锁进行整理。 行锁 表锁 间隙锁 临键锁 MVCC 悲观锁 乐观锁 行锁...

  • MySQL之乐观锁·MVCC

    一、 乐观锁 和 悲观锁 乐观锁 和 悲观锁 是实现并发操作的两种不同的 加锁思想,其中: 乐观锁 假设:操作能成...

  • MVCC原理机制

    目录 背景 前提回顾什么是MVCC什么是当前读和快照读当前读,快照读和MVCC关系MVCC,乐观锁,悲观锁关系 M...

  • mysql 锁

    MySQL学习之——锁(行锁、表锁、页锁、乐观锁、悲观锁等)https://crossoverjie.top/ht...

  • 秒杀随笔

    方法: mysql悲观锁 mysql乐观锁 PHP+redis分布式锁 PHP+redis乐观锁(redis wa...

  • 表锁和行锁

    MySQL中的锁总体可以分为悲观锁和乐观锁。悲观锁MySQL中有自带的锁。乐观锁需要自己写程序控制来实现乐观锁的功...

  • rails中乐观锁和悲观锁的使用

    MySQL乐观锁和悲观锁的介绍可以参考之前的一篇文章MySQL中的锁(行锁,表锁,乐观锁,悲观锁,共享锁,排他锁)...

  • 乐观锁和悲观锁

    参考来源 深入理解乐观锁与悲观锁 乐观锁的一种实现方式——CAS mysql乐观锁总结和实践 乐观锁和悲观锁 悲观...

  • MYSQL 悲观锁和乐观锁

    前文我们提到了表锁,行锁的这些概念,今天我们来谈谈mysql的悲观锁和乐观锁。何为乐观锁?顾名思义,乐观锁就是乐观...

网友评论

      本文标题:MySQL之乐观锁·MVCC

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