当前位置: 首页 > news >正文

手表网站建设社交模板网站建设

手表网站建设,社交模板网站建设,珠海一元夺宝网站建设,网站托管目的是什么这里的更新包括两种操作#xff1a;删、改。更新操作涉及的内容在其他文章里面已经做过介绍了#xff0c;本文主要是介绍更新的代码流程#xff0c;以了解更新操作都做了哪些事情。如果有未介绍过的知识点会详细介绍。 目录改(update)如何判读是否加了行锁删(delete)改(upda…这里的更新包括两种操作删、改。更新操作涉及的内容在其他文章里面已经做过介绍了本文主要是介绍更新的代码流程以了解更新操作都做了哪些事情。如果有未介绍过的知识点会详细介绍。 目录改(update)如何判读是否加了行锁删(delete)改(update) 当执行update语句时h2的执行流程如下 根据查询条件制定执行计划主要就是确认使用哪个索引如果涉及多个表关联确定表的关联顺序等对表加共享锁对表加的共享锁都保存在lockSharedSessions属性中根据查询遍历所有的表记录每遍历一条记录就加一个行锁h2加行锁是在MVPrimaryIndex上加的调用MVPrimaryIndex.lockRow()方法针对每行要修改的记录重新构建一个新的行记录新行记录里面的数据根据SQL语句要求为更新后的数据索引遍历从二级索引开始调用索引的remove()方法将索引中要更新的记录也就是B树中的value更改为VersionedValueUncommitted对象该对象里面保存了原索引的旧值以及更新后的行记录二级索引更新完后更新主键索引更新主键索引的方式与二级索引一样这一步只是将value做了替换key没有变化从主键索引开始遍历向索引中插入新的行记录数据如果是更新B树的value那么将B树中对应位置的value值替换为新的VersionedValueUncommitted对象新对象里面包含了新行记录数据和旧行记录数据如果SQL更新了索引中的字段值那么向B树中直接插入一个新的key和VersionedValueUncommitted对象的value。这样做的好处是当事务回滚或者事务未提交而结束事务那么数据可以恢复到修改前的状态。注意此时索引里面只是插入了新key旧key还记录在B树里面事务提交提交后将表和索引里面的VersionedValueUncommitted对象替换为事务已提交的对象如果索引里面有旧key则直接将key和value删除表解锁也就是解除对表的共享锁。 行锁h2加行锁其实是向表的B树里面插入了一个value为VersionedValueUncommitted的对象VersionedValueUncommitted里面保存了旧值。 VersionedValueUncommitted从类名字上可以得到该对象与版本有关系而且它还表示了事务未提交该对象里面会保存两个数据一个是事务id另一个是undo log的id每有一条记录被更改为VersionedValueUncommitted对象那么便有一条对应的undo log。当两个事务同时操作同一个记录时h2使用VersionedValueUncommitted来判断是否有其他事务已经对该记录加锁了。在本文后面详细介绍VersionedValueUncommitted以及如何判断是否加了行锁。 上面是执行update语句时h2进行的操作。不知道大家注意没有第5步和第6步修改数据都是直接在B树中操作的那么第7步更改B树h2是如何快速做到的难道需要遍历整个B树吗h2能够快速完成第7步操作多亏了undo log其实在第5步和第6步每进行一个操作都会记录一个undo log事务提交的时候直接对undo log回放就可以了。 如何判读是否加了行锁 在介绍h2如何判断一条记录是否已经加了行锁之前先简单介绍下VersionedValueUncommitted类。 一个VersionedValueUncommitted对象表示B树上的一个value对于主键索引来说这个对象里面存储的就是行记录不过这个对象有点特殊它存储的数据表示事务还未提交当事务提交后这个对象就会被清理掉。VersionedValueUncommitted继承自VersionedValueCommitted综合VersionedValueUncommitted的父类及祖先类可以看到VersionedValueUncommitted一共只有三个属性 public final T value;//存储更新后的值private final long operationId;//该值有两部分组成后40 bit表示undo log id其他bit表示的就是事务id也就是正在更新数据的事务idprivate final T committedValue;//存储更新前的值当h2想对某条记录加锁时首先访问索引MVPrimaryIndex根据key找到value如果已经有其他事务对该记录加了锁那么当前事务拿到的value便是VersionedValueUncommitted对象那么h2便可以从VersionedValueUncommitted对象里面得知当前是否有其他事务加锁以及加锁的事务id是多少下面代码是h2拿到VersionedValueUncommitted对象后进行的判断 //existingValue是VersionedValueUncommitted对象的committedValue属性值//existingValue.getOperationId()得到的就是事务id//isThisTransaction()方法判断当前事务是否与已经对行加锁的事务相同if (existingValue null ||// or entry is a committed one(id existingValue.getOperationId()) 0 ||// or it came from the same transactionisThisTransaction(blockingId TransactionStore.getTransactionId(id))) 如果上面的代码判断为false表示已经有其他事务加了锁而且事务还没提交接下来调用toWaitFor.waitForThisToEnd()方法等待一段时间如果在等待期间解锁了那么当前事务重新对行加锁否则抛出所等待超时的异常默认等待时间为2s。 删(delete) delete操作相对update操作来说其执行流程的前三步是一样的都需要先指定执行计划、查出数据、加锁下面直接介绍与update不同的地方。 遍历每个索引从二级索引开始遍历最后遍历主键索引调用每个索引的index.remove()方法与update操作的第五步不同的是这里的VersionedValueUncommitted对象的value属性是null事务提交将各个索引里面的涉及到删除的记录全部删除表解锁也就是解除对表的共享锁。 delete操作可以看做是update操作的子集。
http://www.dnsts.com.cn/news/206218.html

相关文章:

  • 购物网站哪个最好网络培训学校排名
  • 沭阳做网站的公司房产网络平台
  • 网站地图的好处php 企业网站多少钱
  • wap网站建设教程宝应百度seo
  • 商城网站开发平台唐山制作网站的公司
  • 南京建设银行官方网站做视频小网站犯法吗
  • 杭州vi设计策划网站做SEO优化多少钱
  • 做网站一定要实名认证吗制作做动画的网站
  • 河南住房建设厅网站wordpress 自适应主题 rclean
  • 做网站怎么备份数据中国建设银行app下载官网
  • 如何做网站关键字优化wordpress没有icp
  • 专门做金融的招聘网站网站解析密码
  • 网站营运费一个空间怎么放2个网站
  • 重新建设网站的申请报告网站引流推广怎么做
  • 做慧聪网价格网站价格通过企业画册宣传_网络网站建设_新闻媒体合作等方式_
  • 站长平台官网大会注册网站建设
  • 杭州高端网站建设为啥浏览器打不开网页
  • 网站开发设计技术天翼云官网首页
  • 可以做淘宝推广的网站网站域名解析错误怎么办
  • 哪种网站语言最好做网站用哪个电脑
  • wordpress网站后台关于做网站的英语对话
  • 网站开发范围说明书wordpress调用当前分类文章
  • 宁夏住房与城乡建设厅网站net网站开发教学视频
  • 四川网站备案核验单宿州保洁公司电话
  • 中国站长查询域名备案招商网站建设多少钱
  • 无锡网络公司无锡网站设计去国外网站开发客户中的contact us 没有邮箱
  • 酷家乐网站做墙裙教程跨境电商怎么注册开店
  • 国外网站备案流程公司法人查询
  • 网站建设的方法有哪些方面中国纪检监察报投稿
  • 设计网站公司可去亿企邦360免费建站域名