这篇文章主要介绍了mysql中更新语句的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。
1,准备
创建一张测试表
CREATE TABLE “测试”,( ,“id”int (11), NOT NULL AUTO_INCREMENT, ,' c ' int (11), NOT NULL DEFAULT & # 39; 0 & # 39;, COMMENT & # 39;数值& # 39;, ,PRIMARY KEY (id) ),引擎=InnoDB DEFAULT CHARSET=utf8 评论=& # 39;测试表& # 39;;
插入三条数据
INSERT INTO “测试”,(“c”), VALUES (1), (2), (3);
2,测试
加入我要把第一条数据的c值加1,则
UPDATE “测试”,SET “c”,=,“c”, +, 1, WHERE “id”,=, 1;
按照我们平常的思路,就是找出这条记录,把它的值改好,保存就好了。
但我们追究一下细节,由于涉及到修改数据,所以涉及到日志了。
3操作顺序
3.1查找记录:执行器先找引<强>擎取强> id=1这一行.ID是主键,引擎直接用树搜索找到这一行。如果id=1这一行所在的数据页本来就在内存中,就直接返回给执行器;否,则需要先从磁盘读入内存,然后再返回;
3.2 <强>执行器>强拿到引擎返回的行数据,把num改为2,得到新的一行数据,再调用引擎接口写入这行新数据;
3.3引擎将这行新数据更新到<强>内存强>中,同时<强>将这个更新操作记录到重做日志里面>强,此时重做日志处于<强> 强>准备状态;
3.4引擎告知执行器,我执行完成了,你随时可以调我的接口提交事务了;
3.5,执行器生成这个操作的binlog,并把<强> binlog 强>写入磁盘。
3.6 <强>执行器调用引擎的提交事务接口>强,引擎把刚刚写入的重做日志改成<强>提交提交>强状态,更新完成。
<代码> binlog> 代码是mysql内部实现<强>二阶段提交强>的<强>协调者,强>它为每个事务分配一个事务id: XID
<强>一阶段强>:
开启事务,重做日志和日志已撤销经记录了对应的日志,此时事务状态为<代码>准备代码>
<>强二阶段强>:
<代码> binlog> 代码,完成<代码>写和fsync> 代码后,成功,事务一定提交了,否则事务回滚发送提交,清除撤销信息,刷重做,设置事务状态为完成
,null