谈谈MVCC的实现原理、数据库为什么要加锁、锁在多种维度上的分类,同时也聊聊乐观锁和悲观锁

(1)什么是MVCC?MVCC的实现原理是什么?

MVCC,多版本并发控制。MVCC 是通过保存数据在某个时间点的快照来实现的。

实现原理:InnoDB 每一行数据都有一个隐藏的回滚指针,用于指向该行修改前的最后一个历史版本,这个历史版本存放在 undo log 中。如果要执行更新操作,会将原记录放入 undo log 中,并通过隐藏的回滚指针指向 undo log 中的原记录。其它事务此时需要查询时,就是查询 undo log 中这行数据的最后一个历史版本。

MVCC 最大的好处:读不加锁,读写不冲突,极大地增加了 MySQL 的并发性。通过 MVCC,保证了事务 ACID 中的 I(隔离性)特性。

(2)数据库为什么要加锁?

当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。所以,加锁就是为了保证多用户环境下保证数据库完整性和一致性

(3)按照锁的粒度分,数据库锁有哪些?

在关系型数据库中,可以按照锁的粒度,把数据库锁分为行级锁、表级锁和页级锁。锁的开销从大到小,并发能力也从大到小。

行级锁:是MySQL中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁 和排它锁。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。  

表级锁:MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,实现简单,资源消耗较少。表级锁定分为共享锁与排它锁。开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。  

页级锁:是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折中的页级,一次锁定相邻的一组记录。开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

存储引擎:MyISAM采用表级锁。InnoDB支持行级锁和表级锁,默认为行级锁。

(4)从锁的类别上分,MySQL都有哪些锁呢?

共享锁:又叫读锁。当用户要进行数据的读取时,对数据加上共享锁。共享锁可以同时加上多个。

:又叫写锁。当用户要进行数据的写入时,对数据加上排它锁。排它锁只可以加一个,它和其它的排它锁,共享锁都相斥。

(5)数据库的乐观锁和悲观锁是什么?

数据库管理系统(DBMS)中的并发控制的任务,是确保在多个事务同时存取数据库中同一数据时,不破坏ACID原则。悲观锁和乐观锁,是事务并发控制的两种方式。

(6)乐观锁和悲观锁是怎么实现的?使用场景有什么区别?

悲观锁:认为并发环境中数据发生冲突的可能性很大,所以在数据被读取时即对其加锁,阻止其它事务对其进行修改,直到当前事务结束并释放锁。通过数据库提供的锁机制实现。

乐观锁:假设并发冲突发生的概率很低,因此在读取数据时不立即加锁,而在更新数据时,检查在此期间是否有其它事务对数据进行了修改,只有当原值未变时,才执行更新。乐观锁通过数据版本控制(Version)或CAS来实现。

使用场景

乐观锁适用于读多写少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了整个系统的吞吐量。悲观锁适用于读少写多的情况,读少写多的情况会经常产生冲突,所以要用悲观锁降低事务冲突概率,提高系统的性能。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值