MySQL(三)事务与MVCC多版本控制及锁

在这里插入图片描述
什么是数据库的事务?
数据库执行过程中一个逻辑单位
哪些存储引擎支持事务?
InnoDB支持事务,Mysiam不支持
事务四大特性?ACID
原子性:(不可分割,都成功,都失败),回滚操作通过undo log实现
一致性:平衡,-100 ,+100
隔离性:互相不干扰
持久性:事务提交后就是永久性的。事务的恢复通过redo log
在什么地方会用到事务?什么时候回出现事务
发送一个指令到数据库,update,delete,insert自动提交,默认开启事务

事务并发带来的三大问题:
脏读(修改数据没有commit)
在这里插入图片描述
不可重复读(update和delete)
在这里插入图片描述
幻读(只有insert才是幻读)
在这里插入图片描述
以上这种问题有数据库自己提供一定的事务隔离机制来解决。
定义了四种事务隔离级别:建议是有四种隔离级别解决数据库中并发下数据库的事务问题
在这里插入图片描述
虽然串行(xing)化解决了所有问题,但是效率慢

各大厂商
Oracle实现已提交读和串行化
Mysql支持可重复读,InnoDB解决了幻读的问题。既保证效率,又将所有的问题解决
InnoDB是如何解决幻读的?

MVCC多版本控制

第一方案不好,第二种实现读一致性,读快照
在这里插入图片描述

MVCC实现依赖于:隐藏字段,undo log,Read View

read view最核心,

MVCC可以不采用锁机制,而是通过乐观锁的方式来解决不可重复读和幻读,可以在大多情况下替代行级锁,降低系统开销。
这两个字段是InnoDB中隐藏的字段。回滚指针指向undolog
在这里插入图片描述
多个事务对同一个行记录进行更新会产生多个历史快照,这些历史快照保存在undo log中,一个事务查询要读取那个版本记录?这里就用到了read view。它帮我们解决行的可见性问题。
readview就是事物使用MVCC机制进行快照读操作时候产生的读视图。当事务启动,会生成数据库系统当前的一个快照,innodb为每个事务构造了一个数组,用来记录并维护当前活跃事务的id(活跃指启动但没有提交)
在这里插入图片描述
通过MVCC可以解决
1.读写之间阻塞问题
2.降低死锁概率
3.解决快照读的问题。
在这里插入图片描述
另一个事务插入数据读不到,只是在这个事务中,其他事务的操作不影响这个事务的数据。
读取的是快照的数据,而不是最新的数据,如何实现的

第一个事务插入两条数据
在这里插入图片描述
第二个事务,第一次查询
在这里插入图片描述
第三个事务,插入数据
在这里插入图片描述
事务二第二次查询还是之前的数据,刚才事务三新增的数据并没有查询到
在这里插入图片描述
事务4删除数据
在这里插入图片描述
在这里插入图片描述
这就是MVCC工作原理,通过两个影藏列来实现

InnoDB锁的基本类型

表锁和行锁,Myisam是表锁,InnoDB是行锁
在这里插入图片描述

共享锁和排它锁是行锁

共享锁(读锁)
在这里插入图片描述
排它锁(写锁)
在这里插入图片描述
表锁(意向共享锁和意向排它锁)在这里插入图片描述
这张表的任何数据都没有被其他数据锁定,会有一个标志,意向锁,无需进行全表扫描来判断这张表的数据是否全部都没有其他事务锁定,提高加表锁的效率(InnoDB支持表锁)

锁的作用,解决资源竞争问题,解决并发访问
锁的原理?到底锁住了什么?才能实现并发访问?
锁住的是索引,一定有索引,隐藏的rowid
没有用到索引作全表扫描,通过rowid会将表全部锁住,造成锁表的一个现象
InnoDB中辅助索引加锁,主键索引也会被锁住

行锁的算法
1.4.7.10实际存在的

区间划分的概念

在这里插入图片描述
n个record会出现n+1个间隙
如果是字符呢?如何排序?ASCII来进行排序

记录锁

在这里插入图片描述

间隙锁

在这里插入图片描述

临键锁(InnoDB中默认行锁算法)

在这里插入图片描述
这就是InnoDB解决幻读的原因

默认RR(三种锁的算法都会使用)
在这里插入图片描述
RC会使用记录锁,并没有解决幻读问题
在公司好像都是默认的RR
RR和RC主要区别?使用RC会带来额外的好处。
在这里插入图片描述
当没有用到索引的时候,使用update和delete会行锁,而InnoDB会锁表。增加update操作的并发性
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MySQL的多版本并发控制(MVCC)是一种并发控制机制,它主要是为了解决并发读写冲突的问题。在MVCC机制中,每个事务都可以看到数据库中的一个快照,这个快照是在事务开始时确定的。事务读取数据时,实际上是读取了该快照中的数据,而不是实际的数据。当事务需要修改数据时,MySQL会根据数据的版本号来判断是否可以进行修改。 MVCC的实现原理主要是在每一行数据后面保存多个版本号,并且还需要保存该版本号对应的事务ID。当开始一个事务时,MySQL会为该事务分配一个唯一的事务ID,该事务ID会被用于标记事务对应的数据版本号。当一个事务需要读取数据时,MySQL会根据该事务事务ID和版本号来判断是否允许读取该数据。如果该事务事务ID小于等于该数据的版本号,那么就可以读取该数据。如果该事务需要修改数据,则MySQL会为该数据在数据库中创建一个新版本,并将该新版本的版本号和事务ID保存下来。这样,其他事务就可以继续读取原来的版本,而该事务则可以读取新版本并修改数据,从而实现并发控制。 需要注意的是,MVCC只能解决读写冲突的问题,而不能解决写写冲突的问题。此外,MVCC也会占用一定的存储空间,因为每个数据行都需要保存多个版本号和事务ID。因此,在使用MVCC机制时,需要注意存储空间和性能方面的问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值