MVVC多版本并发控制


1、什么是锁?

一种保护机制,在多线程的情况下,保证操作数据的正确性与一致性

2、锁有哪些分类?

悲观锁、乐观锁、独占锁、共享锁、公平锁、非公平锁、分布式锁、自旋锁

3、谈谈悲观锁乐观锁
指的是看待并发同步的角度,一般结合数据库将,以MySQL为例,悲观锁主要是表锁,行锁和间隙锁,叶锁,读锁,因为这些锁在被触发时会引起线程阻塞,所以叫悲观锁;而乐观锁其实在MySQL中本身不存在,但是MySQL提供了MVCC的机制,支持乐观锁机制

4、什么是MVCC?

只有在InnoDB引擎下存在,MVCC是为了实现事务的隔离性,通过版本号,避免同一数据在不同事务间的竞争,所说的乐观锁只在事务级别未提交锁和已提交锁时才会生效

5、具体MVCC机制有什么?

多版本并发控制,保证数据操作在多线程过程中,保证事务隔离的机制,可以降低锁竞争的压力,保证较高的并发量。在每开启一个事务时,会生成一个事务的版本号,被操作的数据会生成一条新的数据行(临时),但是在提交前对其他事务是不可见的,对于数据的更新操作成功,会将这个版本号更新到数据的行中,事务提交成功,将新的版本号更新到此数据行中,这样保证了每个事务操作的数据,都是互不影响的,也不存在锁的问题

6、在多个事务操作同一条数据的并发过程中,谁先成功?

mysql判断,先提交的先成功

7、谈谈事务。

事务常说一系列操作作为一个整体要么都成功要么都失败,主要特性acid,事务的的实现主要依赖两个log redo-log,undo-log,每次事务都会记录数据修改前的数据undo-log,修改后的数据放入redo-log,提出成功则使用redo-log 更新到磁盘,失败则使用undo-log将数据恢复到事务之前的数据

8、再谈谈独占锁、共享锁:

独占锁即是持有锁的线程只有一个,共享锁则可以有多个线程

9、共享的意义在于?

共享锁是为了提高程序的效率,举个例子:数据的操作有读写之分,对于写的操作加锁,保证数据正确性,而对于读的操作如果不加锁,在写读操作同时进行时,读的数据有可能不是最新数据,如果对读操作加独占锁,面对读多写少的程序肯定效率很低,所有就出现了共享锁,对于读的的操作就使用共享的概念,但是对于写的操作则是互斥的,保证了读写的数据操作都一致

 

一丶什么是MVVC?

  MVVC (Multi-Version Concurrency Control) (注:与MVCC相对的,是基于锁的并发控制,Lock-Based Concurrency Control)是一种基于多版本的并发控制协议,只有在InnoDB引擎下存在。MVCC是为了实现事务的隔离性,通过版本号,避免同一数据在不同事务间的竞争,你可以把它当成基于多版本号的一种乐观锁。当然,这种乐观锁只在事务级别未提交锁和已提交锁时才会生效。MVCC最大的好处,相信也是耳熟能详:读不加锁,读写不冲突。在读多写少的OLTP应用中,读写不冲突是非常重要的,极大的增加了系统的并发性能。具体见下面介绍。

二丶MVVC的实现机制

  InnoDB在每行数据都增加两个隐藏字段,一个记录创建的版本号,一个记录删除的版本号。

  在多版本并发控制中,为了保证数据操作在多线程过程中,保证事务隔离的机制,降低锁竞争的压力,保证较高的并发量。在每开启一个事务时,会生成一个事务的版本号,被操作的数据会生成一条新的数据行(临时),但是在提交前对其他事务是不可见的,对于数据的更新(包括增删改)操作成功,会将这个版本号更新到数据的行中,事务提交成功,将新的版本号更新到此数据行中,这样保证了每个事务操作的数据,都是互不影响的,也不存在锁的问题。

三丶MVVC下的CRUD

SELECT:
  当隔离级别是REPEATABLE READ时select操作,InnoDB必须每行数据来保证它符合两个条件:
  1、InnoDB必须找到一个行的版本,它至少要和事务的版本一样老(也即它的版本号不大于事务的版本号)。这保证了不管是事务开始之前,或者事务创建时,或者修改了这行数据的时候,这行数据是存在的。
  2、这行数据的删除版本必须是未定义的或者比事务版本要大。这可以保证在事务开始之前这行数据没有被删除。
符合这两个条件的行可能会被当作查询结果而返回。


INSERT:

  InnoDB为这个新行记录当前的系统版本号。
DELETE:

  InnoDB将当前的系统版本号设置为这一行的删除ID。
UPDATE:

  InnoDB会写一个这行数据的新拷贝,这个拷贝的版本为当前的系统版本号。它同时也会将这个版本号写到旧行的删除版本里。


  这种额外的记录所带来的结果就是对于大多数查询来说根本就不需要获得一个锁。他们只是简单地以最快的速度来读取数据,确保只选择符合条件的行。这个方案的缺点在于存储引擎必须为每一行存储更多的数据,做更多的检查工作,处理更多的善后操作。
  MVCC只工作在REPEATABLE READ和READ COMMITED隔离级别下。READ UNCOMMITED不是MVCC兼容的,因为查询不能找到适合他们事务版本的行版本;它们每次都只能读到最新的版本。SERIABLABLE也不与MVCC兼容,因为读操作会锁定他们返回的每一行数据。

### MySQL 的多版本并发控制 (MVCC) 原理 #### 行级锁定与 MVCC 结合使用 MySQL 的大多数事务性存储引擎并不是简单依赖于行级锁机制来处理并发访问。相反,这些引擎会将行级锁和能够提升并发性能的多版本并发控制技术相结合使用[^1]。 #### 数据库系统的广泛采用 不仅限于 MySQL, 许多其他数据库管理系统也采用了 MVCC 技术,如 PostgreSQL 和 Oracle 等。然而,不同系统之间对于 MVCC 实现的具体方式存在差异,这是因为并没有一个统一的标准定义 MVCC 应该如何运作[^2]。 #### 并发控制的核心功能 MVCC 是一种用于管理事务并发执行期间对数据访问及修改的机制。其核心目的是确保当多个事务同时尝试读取或更新同一份数据时,不会发生诸如脏读、不可重复读等问题。通过这种方式,即使有大量并发操作正在进行,也能保持数据的一致性和完整性[^3]。 #### 版本化记录支持高效查询 为了达到上述目标,每当有一个新的写入请求到来时,而不是直接覆盖现有数据项,而是创建该条目的新版本并保留旧版本的信息。这意味着读者总是能看到最后一次已提交更改之前的状态,而无需担心被未完成的操作干扰[^5]。 ```sql SELECT * FROM table_name WHERE id = 1 FOR UPDATE; ``` 此 SQL 语句展示了如何在一个事务内获取某一行的最新可见版本的同时阻止其它事务对其进行修改直到当前事务结束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值