mvcc多版本并发控制的原理

mvcc多版本并发控制的原理

快照读,并发, mysql的 隐式字段,undo log ,read view 来实现 ,非阻塞读

MVCC简介:

1
MVCC,全称Multi-Version Concurrency Control,(多版本并发控制)的缩写,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。
–同一时刻可能存在多个事务,每个事务对于同一个数据对象(如一行记录)可能有不同的版本,因此在读取数据时需要考虑版本的问题–
MVCC的目的就是多版本并发控制,在数据库中的实现,就是为了解决读写冲突,它的实现原理主要是依赖记录中的 3个隐式字段,undo log ,read view 来实现的。

如何使用好mvcc
MVCC(多版本并发控制)是数据库管理系统实现并发控制的一种方式,常见于基于事务的数据库系统中。如果你想在一个支持MVCC的数据库中开启MVCC,可以按照以下步骤:
确认你的数据库系统支持MVCC,例如PostgreSQL、MySQL、Oracle等常见数据库系统都支持MVCC。
配置数据库的事务隔离级别为“可重复读”或更高级别的隔离级别,这样就可以使得多个事务之间的读取操作不会相互影响。
在应用程序中使用正确的数据库访问方式,例如使用“select”语句时应该加上“for update”或“lock in share mode”等锁定操作,以确保读取到的数据是最新的。
需要注意的是,MVCC的实现方式可能因不同的数据库系统而有所不同,因此在具体实现上可能需要参考相应数据库的文档和指导。


主要概念
事务版本号:每个事务在开始时会被分配一个唯一的版本号,用于标识该事务读取的数据版本。
数据版本号:每个数据对象(如一行记录)都会有一个版本号,用于表示该数据对象的当前版本。
快照:当一个事务开始时,会根据自己的版本号生成一个快照,用于指向该事务可以读取的数据版本。
读操作:当一个事务进行读操作时,会根据自己的快照指向的数据版本,从该版本中读取数据。
写操作:当一个事务进行写操作时,会向数据库中插入一个新的数据版本,并将该版本的版本号与当前事务的版本号进行关联。
通过以上几个概念,MVCC能够实现高并发的读写操作,避免了读写之间的冲突,提高了数据库的性能


-----MVCC 在以下情况下使用效果较好:

高并发读写环境:当数据库面临大量并发读写请求时,使用 MVCC 可以显著提高并发性能。例如,一个电子商务网站,在秒杀活动期间可能会有成千上万的用户同时访问和更新库存信息。MVCC 可以避免锁竞争,提供更好的并发处理能力。

长事务和短事务共存场景:在某些场景下,长时间运行的事务与短时间运行的事务需要同时执行。例如,一个在线银行系统中,某个用户可能需要进行一个长时间的贷款申请过程,同时其他用户可能会进行简短的账户查询操作。使用 MVCC 可以避免长事务阻塞短事务,提供更好的响应性能。

读多写少的场景:当数据库中读操作频率高于写操作时,MVCC 可以更好地满足需求。例如,一个新闻发布系统,大多数用户只是读取新闻内容,而只有少数编辑人员才会进行写操作。使用 MVCC 可以允许读操作并发执行,提高读取性能,同时确保数据的一致性。

快照读取需求:某些应用程序需要在事务执行期间保持一致的快照视图,而不受其他事务的影响。例如,一个在线论坛系统中,用户在查看帖子时可能希望看到一致的快照,而不受其他用户的回复操作的干扰。使用 MVCC 可以为每个事务提供一致性的快照,确保读取操作的准确性。

需要注意的是,MVCC 并不是适用于所有场景的解决方案。在一些写多读少、数据一致性要求较高的场景中,使用传统的锁机制可能更加合适。MVCC 在面对大量并发写入操作时可能会导致版本数量过多,增加存储空间的消耗。因此,在选择是否使用 MVCC 时,需要综合考虑应用场景的特点和需求。


   以下是一些实际开发场景中使用 MVCC 的例子:

数据库管理系统(DBMS):许多现代的数据库管理系统使用 MVCC 来处理并发访问和事务控制。例如,PostgreSQL 和 MySQL InnoDB 存储引擎都使用 MVCC 来提供高并发性能和数据一致性。

Web 应用程序:许多 Web 应用程序需要处理大量并发请求,其中读操作频率通常高于写操作。使用 MVCC 可以提供更好的读取性能和并发处理能力。例如,一个电子商务网站中的商品展示和搜索功能可以使用 MVCC 来保证读取的一致性,并允许多个用户同时进行浏览和搜索操作。

博客或论坛系统:博客或论坛系统需要保证读取操作的一致性,并且允许多个用户同时浏览帖子和评论。MVCC 可以提供每个用户一致的快照视图,确保他们看到的是一致的数据,同时允许其他用户进行并发的读写操作。

版本控制系统:版本控制系统用于管理代码的版本历史和协作开发。多个开发人员可能同时编辑同一个文件,并且需要保证一致的快照视图和避免冲突。MVCC 可以提供每个开发人员一致的代码版本视图,使得并发编辑和提交操作能够协调进行。

并发日志处理:某些系统需要处理大量的日志记录,并且多个写入操作可能同时发生。MVCC 可以提供每个写入操作一致的快照视图,确保记录的顺序和一致性。这对于日志处理和分析系统非常重要。

这些例子只是 MVCC 在实际开发中的一部分应用场景,实际使用 MVCC 还会根据具体需求和系统设计而有所不同。MVCC 提供了一种灵活的并发控制方式,适用于许多需要处理并发读写的应用程序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值