当前位置: 首页 > news >正文 沭阳县建设局网站有做网站网站的么 news 2025/10/24 22:25:35 沭阳县建设局网站,有做网站网站的么,创意网店名,40岁以上的设计师都去哪了了解MVCC之前#xff0c;我们首先需要了解以下两个概念#xff1a;一致性非锁定读和锁定读#xff0c;了解这两个概念之后我们在逐步分析MVCC。 一致性非锁定读和锁定读 一致性非锁定读(快照读) 对于 一致性非锁定读的实现#xff0c;通常做法是加一个版本号或者时间戳字…了解MVCC之前我们首先需要了解以下两个概念一致性非锁定读和锁定读了解这两个概念之后我们在逐步分析MVCC。 一致性非锁定读和锁定读 一致性非锁定读(快照读) 对于 一致性非锁定读的实现通常做法是加一个版本号或者时间戳字段在更新数据的同时版本号 1 或者更新时间戳。查询时将当前可见的版本号与对应记录的版本号进行比对如果记录的版本小于可见版本则表示该记录可见。 在 InnoDB 存储引擎中MVCC 就是对非锁定读的实现。如果读取的行正在执行 DELETE 或 UPDATE 操作这时读取操作不会去等待行上锁的释放。相反地InnoDB 存储引擎会去读取行的一个快照数据对于这种读取历史数据的方式我们叫它快照读 。 在 Repeatable Read 和 Read Committed 两个隔离级别下如果是执行普通的 select 语句不包括 select ... lock in share mode ,select ... for update则会使用 一致性非锁定读MVCC。并且在 Repeatable Read 下 MVCC 实现了可重复读和防止部分幻读。 锁定读(当前读) 如果执行的是下列语句就是 锁定读 select ... lock in share modeselect ... for updateinsert、update、delete 操作 在锁定读下读取的是数据的最新版本这种读也被称为 当前读。锁定读会对读取到的记录加锁 select ... lock in share mode对记录加 S 锁其它事务也可以加S锁如果加 x 锁则会被阻塞select ... for update、insert、update、delete对记录加 X 锁且其它事务不能加任何锁 在一致性非锁定读下即使读取的记录已被其它事务加上 X 锁这时记录也是可以被读取的即读取的快照数据。上面说了在 Repeatable Read 下 MVCC 防止了部分幻读这边的 “部分” 是指在 一致性非锁定读 情况下只能读取到第一次查询之前所插入的数据根据 Read View 判断数据可见性Read View 在第一次查询时生成。但是如果是 当前读 每次读取的都是最新数据这时如果两次查询中间有其它事务插入数据就会产生幻读。所以 InnoDB 在实现Repeatable Read 时如果执行的是当前读则会对读取的记录使用 Next-key Lock 来防止其它事务在间隙间插入数据。 MVCC 具体实现 MVCC 的实现主要依赖于隐藏字段、Read View、undo log。在内部实现中InnoDB 通过数据行的 DB_TRX_ID 和 Read View 来判断数据的可见性如不可见则通过数据行的 DB_ROLL_PTR 找到 undo log 中的历史版本。每个事务读到的数据版本可能是不一样的在同一个事务中用户只能看到该事务创建 Read View 之前已经提交的修改和该事务本身做的修改。 隐藏字段 在内部InnoDB 存储引擎为每行数据添加了三个隐藏字段 DB_TRX_ID6字节表示最后一次插入或更新该行的事务 id。此外delete 操作在内部被视为更新只不过会在记录头 Record header 中的 deleted_flag 字段将其标记为已删除。DB_ROLL_PTR7字节 回滚指针指向该行的 undo log 。如果该行未被更新则为空。DB_ROW_ID6字节如果没有设置主键且该表没有唯一非空索引时InnoDB 会使用该 id 来生成聚簇索引。 ReadView class ReadView {/* ... */ private:trx_id_t m_low_limit_id; /* 大于等于这个 ID 的事务均不可见 */trx_id_t m_up_limit_id; /* 小于这个 ID 的事务均可见 */trx_id_t m_creator_trx_id; /* 创建该 Read View 的事务ID */trx_id_t m_low_limit_no; /* 事务 Number, 小于该 Number 的 Undo Logs 均可以被 Purge */ids_t m_ids; /* 创建 Read View 时的活跃事务列表 */m_closed; /* 标记 Read View 是否 close */ }ReadView主要是用来做可见性判断里面保存了 “当前对本事务不可见的其他活跃事务” 主要有以下字段 m_low_limit_id目前出现过的最大的事务 ID1即下一个将被分配的事务 ID。大于等于这个 ID 的数据版本均不可见。m_up_limit_id活跃事务列表 m_ids 中最小的事务 ID如果 m_ids 为空则 m_up_limit_id 为 m_low_limit_id。小于这个 ID 的数据版本均可见。m_idsRead View 创建时其他未提交的活跃事务 ID 列表。创建 Read View时将当前未提交事务 ID 记录下来后续即使它们修改了记录行的值对于当前事务也是不可见的。m_ids 不包括当前事务自己和已提交的事务正在内存中。m_creator_trx_id创建该 Read View 的事务 ID。 undo log undo log 主要有两个作用 当事务回滚时用于将数据恢复到修改前的样子。另一个作用是 MVCC 当读取记录时若该记录被其他事务占用或当前版本对该事务不可见则可以通过 undo log 读取之前的版本数据以此实现非锁定读。 在 InnoDB 存储引擎中 undo log 分为两种 insert undo log 和 update undo log insert undo log 指在 insert 操作中产生的 undo log。因为 insert 操作的记录只对事务本身可见对其他事务不可见故该 undo log 可以在事务提交后直接删除。不需要进行 purge 操作。 insert 时的数据初始状态 update undo log update 或 delete 操作中产生的 undo log。该 undo log可能需要提供 MVCC 机制因此不能在事务提交时就进行删除。提交时放入 undo log 链表等待 purge线程 进行最后的删除。 数据第一次被修改时 数据第二次被修改时 不同事务或者相同事务的对同一记录行的修改会使该记录行的 undo log 成为一条链表链首就是最新的记录链尾就是最早的旧记录。 数据可见性算法重要 在 InnoDB 存储引擎中创建一个新事务后执行每个 select 语句前都会创建一个快照Read View快照中保存了当前数据库系统中正处于活跃没有 commit的事务的 ID 号。其实简单的说保存的是系统中当前不应该被本事务看到的其他事务 ID 列表即 m_ids。当用户在这个事务中要读取某个记录行的时候InnoDB 会将该记录行的 DB_TRX_ID 与 Read View 中的一些变量及当前事务 ID 进行比较判断是否满足可见性条件。具体判断流程如下所示 如果记录 DB_TRX_ID m_up_limit_id那么表明最新修改该行的事务DB_TRX_ID在当前事务创建快照之前就提交了所以该记录行的值对当前事务是可见的 如果 DB_TRX_ID m_low_limit_id那么表明最新修改该行的事务DB_TRX_ID在当前事务创建快照之后才修改该行所以该记录行的值对当前事务不可见。跳到步骤 5 m_ids 为空则表明在当前事务创建快照之前修改该行的事务就已经提交了所以该记录行的值对当前事务是可见的 如果 m_up_limit_id DB_TRX_ID m_low_limit_id表明最新修改该行的事务DB_TRX_ID在当前事务创建快照的时候可能处于“活动状态”或者“已提交状态”所以就要对活跃事务列表 m_ids 进行查找源码中是用的二分查找因为是有序的 如果在活跃事务列表 m_ids 中能找到 DB_TRX_ID表明① 在当前事务创建快照前该记录行的值被事务 ID 为 DB_TRX_ID 的事务修改了但没有提交或者 ② 在当前事务创建快照后该记录行的值被事务 ID 为 DB_TRX_ID 的事务修改了。这些情况下这个记录行的值对当前事务都是不可见的。跳到步骤 5 在活跃事务列表中找不到则表明“id 为 trx_id 的事务”在修改“该记录行的值”后在“当前事务”创建快照前就已经提交了所以记录行对当前事务可见 在该记录行的 DB_ROLL_PTR 指针所指向的 undo log 取出快照记录用快照记录的 DB_TRX_ID 跳到步骤 1 重新开始判断直到找到满足的快照版本或返回空 RC 和 RR 隔离级别下 MVCC 的差异 在面试过程中这个问题感觉还是很常见的所以还是有必要说一下。 虽然两者都使用MVCC但它们生成 Read View 的时机却不同 在 RC 隔离级别下的 每次select 查询前都生成一个Read View (m_ids 列表)在 RR 隔离级别下只在事务开始后 第一次select 数据前生成一个Read Viewm_ids 列表 如何解决不可重复读 上面我们已经说明了RC和RR两个隔离级别使用MVCC的区别在于生成ReadView的时机不同我们接下来通过一个例子深入理解一下。 举个例子 101事务102事务103事务T1beginT2beginbeginT3update user set name 张三 where id 1T4update user set name 李四 where id 1select * from user where id 1;T5commitupdate user set name 王五 where id 1T6select * from user where id 1;T7update user set name 赵六 where id 1T8commitT9select * from user where id 1;T10commit RC模式 假设时间线来到 T4 那么此时数据行 id 1 的版本链为 由于 RC 级别下每次查询都会生成Read View 并且事务 101、102 并未提交此时 103 事务生成的 Read View 中活跃的事务 m_ids 为[101,102] m_low_limit_id为104m_up_limit_id为101m_creator_trx_id 为103 此时最新记录的 DB_TRX_ID 为 101m_up_limit_id 101 m_low_limit_id所以要在 m_ids 列表中查找发现 DB_TRX_ID 存在列表中那么这个记录不可见。根据 DB_ROLL_PTR 找到 undo log 中的上一版本记录上一条记录的 DB_TRX_ID 还是 101不可见。继续找上一条 DB_TRX_ID为 1满足 1 m_up_limit_id可见所以事务 103 查询到数据为 name 菜花。 时间线来到T6 因为在 RC 级别下重新生成 Read View这时事务 101 已经提交102 并未提交所以此时 Read View 中活跃的事务 m_ids[102] m_low_limit_id为104m_up_limit_id为102m_creator_trx_id为103 此时最新记录的 DB_TRX_ID 为 102m_up_limit_id 102 m_low_limit_id所以要在 m_ids 列表中查找发现 DB_TRX_ID 存在列表中那么这个记录不可见根据 DB_ROLL_PTR 找到 undo log 中的上一版本记录上一条记录的 DB_TRX_ID 为 101满足 101 m_up_limit_id记录可见所以在 T6 时间点查询到数据为 name 李四与时间 T4 查询到的结果不一致不可重复读 时间线来到T9 继续重新生成 Read View 这时事务 101 和 102 都已经提交所以 m_ids 为空则 m_up_limit_id m_low_limit_id 104最新版本事务 ID 为 102满足 102 m_low_limit_id可见查询结果为 name 赵六。 可以发现由于每次查询开始时都会重新生成ReadView所以导致不可重复读。 RR模式 在可重复读级别下只会在事务开始后第一次读取数据时生成一个 Read Viewm_ids 列表不变。 T4时间线 在当前执行 select 语句时生成一个 Read View此时 m_ids[101,102] m_low_limit_id为104m_up_limit_id为101m_creator_trx_id 为103 此时和 RC 级别下一样 最新记录的 DB_TRX_ID 为 101m_up_limit_id 101 m_low_limit_id所以要在 m_ids 列表中查找发现 DB_TRX_ID 存在列表中那么这个记录不可见。根据 DB_ROLL_PTR 找到 undo log 中的上一版本记录上一条记录的 DB_TRX_ID 还是 101不可见。继续找上一条 DB_TRX_ID为 1满足 1 m_up_limit_id可见所以事务 103 查询到数据为 name 菜花。 T6时间线 在 RR 级别下只会生成一次Read View所以此时依然沿用 m_ids [101,102] m_low_limit_id为104m_up_limit_id为101m_creator_trx_id 为103 最新记录的 DB_TRX_ID 为 102m_up_limit_id 102 m_low_limit_id所以要在 m_ids 列表中查找发现 DB_TRX_ID 存在列表中那么这个记录不可见。根据 DB_ROLL_PTR 找到 undo log 中的上一版本记录上一条记录的 DB_TRX_ID 为 101不可见。继续根据 DB_ROLL_PTR 找到 undo log 中的上一版本记录上一条记录的 DB_TRX_ID 还是 101不可见。继续找上一条 DB_TRX_ID为 1满足 1 m_up_limit_id可见所以事务 103 查询到数据为 name 菜花。 T9时间线 此时情况跟 T6 完全一样由于已经生成了 Read View此时依然沿用 m_ids [101,102] 所以查询结果依然是 name 菜花。 所以由上面的例子可见在RR模式下能解决不可重复读问题。 如何解决幻读 InnoDB存储引擎在 RR 级别下通过 MVCC和 Next-key Lock 来解决幻读问题 1、执行普通 select此时会以 MVCC 快照读的方式读取数据 在快照读的情况下RR 隔离级别只会在事务开启后的第一次查询生成 Read View 并使用至事务提交。所以在生成 Read View 之后其它事务所做的更新、插入记录版本对当前事务并不可见实现了可重复读和防止快照读下的 “幻读”。 2、执行 select…for update/lock in share mode、insert、update、delete 等当前读 在当前读下读取的都是最新的数据如果其它事务有插入新的记录并且刚好在当前事务查询范围内就会产生幻读InnoDB 使用 Next-key Lock来防止这种情况。当执行当前读时会锁定读取到的记录的同时锁定它们的间隙防止其它事务在查询范围内插入数据。 以上便是MVCC相关内容如有错误请及时指正。 文章转载自: http://www.morning.zzbwjy.cn.gov.cn.zzbwjy.cn http://www.morning.qnbck.cn.gov.cn.qnbck.cn http://www.morning.yhplt.cn.gov.cn.yhplt.cn http://www.morning.ahlart.com.gov.cn.ahlart.com http://www.morning.rxwnc.cn.gov.cn.rxwnc.cn http://www.morning.zdxinxi.com.gov.cn.zdxinxi.com http://www.morning.tpqzs.cn.gov.cn.tpqzs.cn http://www.morning.dyxlm.cn.gov.cn.dyxlm.cn http://www.morning.bgqr.cn.gov.cn.bgqr.cn http://www.morning.lxjxl.cn.gov.cn.lxjxl.cn http://www.morning.hmqjj.cn.gov.cn.hmqjj.cn http://www.morning.wmmqf.cn.gov.cn.wmmqf.cn http://www.morning.ydyjf.cn.gov.cn.ydyjf.cn http://www.morning.hxmqb.cn.gov.cn.hxmqb.cn http://www.morning.frpb.cn.gov.cn.frpb.cn http://www.morning.zryf.cn.gov.cn.zryf.cn http://www.morning.rcbdn.cn.gov.cn.rcbdn.cn http://www.morning.nnrqg.cn.gov.cn.nnrqg.cn http://www.morning.ljdhj.cn.gov.cn.ljdhj.cn http://www.morning.msxhb.cn.gov.cn.msxhb.cn http://www.morning.bwgrd.cn.gov.cn.bwgrd.cn http://www.morning.dysgr.cn.gov.cn.dysgr.cn http://www.morning.qtltg.cn.gov.cn.qtltg.cn http://www.morning.wypyl.cn.gov.cn.wypyl.cn http://www.morning.gtbjc.cn.gov.cn.gtbjc.cn http://www.morning.ydxg.cn.gov.cn.ydxg.cn http://www.morning.drnfc.cn.gov.cn.drnfc.cn http://www.morning.kpygy.cn.gov.cn.kpygy.cn http://www.morning.dfkmz.cn.gov.cn.dfkmz.cn http://www.morning.cjmmn.cn.gov.cn.cjmmn.cn http://www.morning.qztsq.cn.gov.cn.qztsq.cn http://www.morning.xnkb.cn.gov.cn.xnkb.cn http://www.morning.vvdifactory.com.gov.cn.vvdifactory.com http://www.morning.bmtyn.cn.gov.cn.bmtyn.cn http://www.morning.sfqtf.cn.gov.cn.sfqtf.cn http://www.morning.fqmcc.cn.gov.cn.fqmcc.cn http://www.morning.kfstq.cn.gov.cn.kfstq.cn http://www.morning.rlhh.cn.gov.cn.rlhh.cn http://www.morning.gkktj.cn.gov.cn.gkktj.cn http://www.morning.lnnc.cn.gov.cn.lnnc.cn http://www.morning.rui931.cn.gov.cn.rui931.cn http://www.morning.szzxqc.com.gov.cn.szzxqc.com http://www.morning.ldhbs.cn.gov.cn.ldhbs.cn http://www.morning.qdxkn.cn.gov.cn.qdxkn.cn http://www.morning.lsgsn.cn.gov.cn.lsgsn.cn http://www.morning.wlgpz.cn.gov.cn.wlgpz.cn http://www.morning.bmqls.cn.gov.cn.bmqls.cn http://www.morning.htbgz.cn.gov.cn.htbgz.cn http://www.morning.pjfmq.cn.gov.cn.pjfmq.cn http://www.morning.xnqwk.cn.gov.cn.xnqwk.cn http://www.morning.wylpy.cn.gov.cn.wylpy.cn http://www.morning.qcmhs.cn.gov.cn.qcmhs.cn http://www.morning.buyid.com.cn.gov.cn.buyid.com.cn http://www.morning.cwgn.cn.gov.cn.cwgn.cn http://www.morning.dbrdg.cn.gov.cn.dbrdg.cn http://www.morning.tyklz.cn.gov.cn.tyklz.cn http://www.morning.hrrmb.cn.gov.cn.hrrmb.cn http://www.morning.hjsrl.cn.gov.cn.hjsrl.cn http://www.morning.tkgjl.cn.gov.cn.tkgjl.cn http://www.morning.plzgt.cn.gov.cn.plzgt.cn http://www.morning.kxqfz.cn.gov.cn.kxqfz.cn http://www.morning.lmhh.cn.gov.cn.lmhh.cn http://www.morning.txjrc.cn.gov.cn.txjrc.cn http://www.morning.kbbmj.cn.gov.cn.kbbmj.cn http://www.morning.incmt.com.gov.cn.incmt.com http://www.morning.mksny.cn.gov.cn.mksny.cn http://www.morning.rsnd.cn.gov.cn.rsnd.cn http://www.morning.tgwfn.cn.gov.cn.tgwfn.cn http://www.morning.cqyhdy.cn.gov.cn.cqyhdy.cn http://www.morning.mswkd.cn.gov.cn.mswkd.cn http://www.morning.wdjcr.cn.gov.cn.wdjcr.cn http://www.morning.zqcdl.cn.gov.cn.zqcdl.cn http://www.morning.hrtwt.cn.gov.cn.hrtwt.cn http://www.morning.pfmsh.cn.gov.cn.pfmsh.cn http://www.morning.rwmp.cn.gov.cn.rwmp.cn http://www.morning.ljdtn.cn.gov.cn.ljdtn.cn http://www.morning.mhwtq.cn.gov.cn.mhwtq.cn http://www.morning.hsrpr.cn.gov.cn.hsrpr.cn http://www.morning.xfmwk.cn.gov.cn.xfmwk.cn http://www.morning.spwln.cn.gov.cn.spwln.cn 查看全文 http://www.tj-hxxt.cn/news/246502.html 相关文章: 网站建设找哪一家好微信支付开发文档 潍坊米搜网站建设网站 分辨率 表格做的网站影响收录PHP做网站的核心是什么 什么网站可以做调察问卷提高网站注册率 专业做物业网站的公司知名的网站开发公司 深圳建站网络公司playyo wordpress 小红书营销推广方式关键词优化排名价格 仿牌 镜像网站做软件用什么软件 洛可可设计公司怎么样南昌做网站优化哪家好 广西学校论坛网站建设wordpress 主题 简约 专业做合同的网站龙之向导外贸论坛 现在在市场上做网站怎么样网站备案主体信息变更 网站开发翻译插件青岛专业网站开发 哪里专业做网站农业机械网站模板 免费高清图片素材网站有哪些网站建设有什么理论依据 简单的网站模板产品营销策略 怎样才能把网站宣传做的更好哪里有个人卖房网站 flash网站项目背景wordpress 不能换主题 网站设计功能在线网站制作工具 杭州网站建设蒙特网站收录减少 奢侈品的网站设计wordpress客户案例 电商行业网站建设及维护徐东网站建设 城阳网站建设公司电话动漫网站的建设目标 网站的下载链接怎么做上海网站开发制作 海南省建设执业资格注册管理中心网站360渠道推广系统 黄石专业网站建设推广wordpress 中文 模板下载 沈阳专业网站建设报价wordpress 爱情模板 洛谷网站中小玉文具怎么做织梦cms如何做网站 资讯网站wordpress源代码如何在本地编辑 广州市天河区工程建设监督网站wordpress知更鸟教程