zoukankan      html  css  js  c++  java
  • rc级别 避免脏读的实现(LBCC & MVCC)

    两种方式:

    LBCC和MVCC

    先看LBCC:

    从此隔离级别效果入手:事务只能读其他事务已提交的的记录。
    数据库事务隔离级别的实现,InnoDB 支持行级锁,写时加的是行级排他锁(X lock),那么当其他事务访问另一个事务正在update (除select操作外其他操作本质上都是写操作)的同一条记录时,事务的读操作会被阻塞。所以只能等到记录(其实是索引上的锁)上的排他锁释放后才能进行访问,也就是事务提交的时候。这样确实能实现read commited隔离级别效果。
    数据库这样做确实可以实现 事务只能读其他事务已提交的的记录 的效果,但是这是很低效的一种做法,为什么呢?因为对于大部分应用来说,读操作是多于写操作的,当写操作加锁时,那么读操作全部被阻塞,这样会导致应用的相应能力受数据库的牵制。
    作者: mark_rock 
    链接:http://www.imooc.com/article/17290?block_id=tuijian_wz
    来源:慕课网

    写、加排他锁-升级后的当前读加共享锁或排他锁 - 阻塞

    MVCC:

    mysql对于大量的rc级别快照读操作,考虑性能,使用mvcc实现

    那就是 InnoDB 的辅助打得好,因为内部使用了 MVCC 机制,实现了一致性非阻塞读,大大提高了并发读写效率,写不影响读,且读到的事记录的镜像版本。
    作者: mark_rock 
    链接:http://www.imooc.com/article/17290?block_id=tuijian_wz
    来源:慕课网

    那具体是如何实现的呢:

    2.MVCC 实现的依赖项
    MVCC 在mysql 中的实现依赖的是 undo log 与 read view。

    1.undo log: undo log中记录的是数据表记录行的多个版本,也就是事务执行过程中的回滚段,其实就是MVCC 中的一行原始数据的多个版本镜像数据。2.read view:主要用来判断当前版本数据的可见性。

    3.undo log

    undo log是为回滚而用,具体内容就是copy事务前的数据库内容(行)到undo buffer,在适合的时间把undo buffer中的内容刷新到磁盘。undo buffer与redo buffer一样,也是环形缓冲,但当缓冲满的时候,undo buffer中的内容会也会被刷新到磁盘;与redo log不同的是,磁盘上不存在单独的undo log文件,所有的undo log均存放在主ibd数据文件中(表空间),即使客户端设置了每表一个数据文件也是如此。

    我们通过行的更新过程来看下undo log 是如何形成的?

    3.1 行的更新过程
    下面演示下事务对某行记录的更新过程:

    1. 初始数据行

      F1~F6是某行列的名字,1~6是其对应的数据。后面三个隐含字段分别对应该行的事务号和回滚指针,假如这条数据是刚INSERT的,可以认为ID为1,其他两个字段为空。
      2.事务1更改该行的各字段的值

      当事务1更改该行的值时,会进行如下操作:
      用排他锁锁定该行
      记录redo log
      把该行修改前的值Copy到undo log,即上图中下面的行
      修改当前行的值,填写事务编号,使回滚指针指向undo log中的修改前的行
      3.事务2修改该行的值

      与事务1相同,此时undo log,中有有两行记录,并且通过回滚指针连在一起。

     


    作者: mark_rock 
    链接:http://www.imooc.com/article/17290?block_id=tuijian_wz
    来源:慕课网

  • 相关阅读:
    JavaWeb 之 使用 commons-fileupload.jar 实现文件上传
    JavaWeb 之 web项目中的路径问题
    JavaWeb 之 GET请求和POST请求的乱码问题
    URI、URL 和 URN 的区别
    JavaWeb 之 ServletConfig 接口
    JavaWeb 之 使用开发工具创建 Servlet 程序
    JavaWeb 之 GET和POST 请求的分发处理
    JavaWeb 【目录】----------------------------------------【目录】
    JavaWeb 之 开发工具整合 Tomcat服务器
    【LeetCode-数学】Excel表列序号
  • 原文地址:https://www.cnblogs.com/silyvin/p/9106660.html
Copyright © 2011-2022 走看看