数据库锁机制和mysql mvcc机制

数据库锁

1.从性能来分
乐观锁和悲观锁

悲观锁顾名思义,就是对数据的冲突采取一种悲观的态度,也就是说假设数据肯定会冲突,所以在数据开始读取的时候就把数据锁定住。
  悲观锁 实现方式  select * from user where id = 1 for update; 
乐观锁就是认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让用户返回错误的信息,让用户决定如何去做。
   乐观锁实现方式 一般会加一个versionNo 每次更新前比对当前版本号和数据库版本号是否一致  更新时每次加一

2.从操作类型上分
读锁和写锁

类比java的ReentrantReadWriteLock
读锁(共享锁) 针对同一份数据,多次读操作可以同时进行而不会相互影响
写锁(排它锁) 当前写操作没有完成的会阻断其他写锁和读锁

3.从数据库操作的粒度来分
行锁和表锁

行锁   锁住所需要的行   加锁慢 锁粒度小 并发高
表锁  锁住整张表    枷锁快 锁粒度大  并发低

mysql MVCC机制

MVCC 即 多版本并发控制

mysql 的大多数事务型存储引擎实现的都不是简单的行级锁,
基于提升并发性能的考虑,他们一般都同时实现了多版本并发控制MVCC
可以认为MVCC是行级锁的变种,但是它再很多情况下避免了加锁操作,因此开销更低。
虽然实现机制有所不同,但大豆实现了分组色的读操作,写操作也只锁定必要的行

基本原理

MVCC的实现,通过保存数据在某个时间点的快照来实现的。
这意味着一个事务无论运行多长时间,在同一个事务里能够看到数据一致的视图。
根据事务开始的时间不同,同时也意味着在同一个时刻不同事务看到的相同表里的数据可能是不同的。

innoDB存储引擎MVCC的实现策略

每行记录后面保存两个隐藏的,一个保存行的创建时间,一个保存行的过期时间(或删除时间),当然存储
的并实施时间的时间值,而是系统版本号(system version number) ,每一个新的事务 系统版本号
都会自动递增
事务开始时刻的系统版本号会作为事务版本号,用来和查询每行记录的版本号比较

下面为再REPEATABLE_READ隔离级别下,MVCC具体操作流程

1.SELECT

InnoDB 会根据以下两个条件检查每行记录
  a InnoDB  只查找版本早于当前事务版本的数据行(也就是,行的版本号小于或等于事务的系统版本号),这样可以确保事务读取的行,要么时再事务开始前已经存在,要么是事务自身插入或者修改过的。
  b 行的删除版本要么未定义,要么大于当前事务版本号。这可以确保事务读取到的行,在事务开始之前未被删除。
  只有符合上述两个条件的记录,才能返回作为查询结果

2.INSERT

InnoDB 为新插入的每一行保存当前系统版本号作为行版本号

3.DELETE

InnoDB 为删除的每一行保存当前系统版本号作为行删除标识

4.UPDATE

在更新操作的时候,采用的是先标记旧的那行记录为已删除,并且删除版本号是事务版本号,然后插入一行新的记录的方式。

补充

1.MVCC手段只适用于Msyql隔离级别中的读已提交(Read committed)和可重复读(Repeatable Read).

2.Read uncimmitted由于存在脏读,即能读到未提交事务的数据行,所以不适用MVCC.

原因是MVCC的创建版本和删除版本只要在事务提交后才会产生。

3.串行化由于是会对所涉及到的表加锁,并非行锁,自然也就不存在行的版本控制问题。

4.通过以上总结,可知,MVCC主要作用于事务性的,有行锁控制的数据库模型。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值