• ADADADADAD

    MVCC 在RC 和 RR 隔离等级下的工作机制[ mysql数据库 ]

    mysql数据库 时间:2024-12-03 12:11:40

    作者:文/会员上传

    简介:

    一.数据行隐藏列
    innodb为每行记录都实现了三个隐藏字段
    6字节的事务ID(DB_TRX_ID)
    7字节的回滚指针(DB_ROLL_PTR)
    隐藏的ID



    事务1修改行值过程:
    X锁锁定该行 -> 记录redo

    以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。


    一.数据行隐藏列
    innodb为每行记录都实现了三个隐藏字段
    6字节的事务ID(DB_TRX_ID)
    7字节的回滚指针(DB_ROLL_PTR)
    隐藏的ID



    事务1修改行值过程:
    X锁锁定该行 -> 记录redo log -> 把该行修改前的值copy至undo ->修改当前行的值,填写事务编号,使回滚指针指向undo log中的修改前的行



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




    二.RC 和 RR 适用MVCC的过程

    RC事务开始(1).执行SQL语句之前,将系统中非当前活跃事务信息输出到一个副本trx_list(2).用户在当前SQL开始读取记录,假设读取到的记录事务ID为trx_id_0(3).找出trx_list中最早的事务trx_id_1和最晚的事务trx_id_2(4).如果trx_id_0<trx_id_1则表示该行记录在本sql执行之前已经commit,所以该行可见。转至(8)</trx_id_1则表示该行记录在本sql执行之前已经commit,所以该行可见。转至(8)<>(5).如果trx_id_0>trx_id_2则表示该行记录在本SQL执行之后发生了其他事务,因此该行不可见。转至(7)(6).如果trx_id_1<=trx_id_0<=trx_id_2则表示该行记录在本SQL开启时处于活动状态,因此该行不可见。转至(7)(7).从该行记录的DB_ROLL_PTR指针所指向的回滚段中取出最新的undo-log的版本号,将它赋值该trx_id_0,然后跳到步骤(4)(8).将该行的数据返回给用户,跳转至(2)(9).所有记录遍历完毕,关闭trx_list,跳转至(1),执行下一条SQL事务结束
    RR事务开始,将系统中非当前活跃事务信息输出到一个副本trx_list(1).执行SQL语句(2).用户在当前本事务开始读取记录,假设读取到的记录事务ID为trx_id_0(3).找出trx_list中最早的事务trx_id_1和最晚的事务trx_id_2(4).如果trx_id_0<trx_id_1则表示该行记录在本事务开启之前已经commit,所以该行可见。转至(8)</trx_id_1则表示该行记录在本事务开启之前已经commit,所以该行可见。转至(8)<>(5).如果trx_id_0>trx_id_2则表示该行记录在本事务开启之后发生了其他事务,因此该行不可见。转至(7)(6).如果trx_id_1<=trx_id_0<=trx_id_2则表示该行记录在本事务开启时处于活动状态,因此该行不可见。转至(7)(7).从该行记录的DB_ROLL_PTR指针所指向的回滚段中取出最新的undo-log的版本号,将它赋值该trx_id_0,然后跳到步骤(4)(8).将该行的数据返回给用户,跳转至(2)(9).所有记录遍历完毕,跳转至(1),执行下一条SQL事务结束,关闭trx_list
    三.MVCC读类型
    1.快照读
    读取的是记录的可见版本,或是从undo中读取的历史版本。
    普通的查询即为快照读

    2.当前读
    读取的是记录的最新版本,会与dml语句发生阻塞。
    select * from table where ? lock in share mode;
    select * from table where ? for update;


    转载:
    作者: mark_rock
    链接:http://www.imooc.com/article/17290?block_id=tuijian_wz
    来源:慕课网
    MVCC 在RC 和 RR 隔离等级下的工作机制.docx

    将本文的Word文档下载到电脑

    推荐度:

    下载
    热门标签: mvccrcrr