废话不多说先来张图解释

update T set value = value+1 where ID =2
复制代码

我想可能大部分人看完这图,思考片刻,接下来的就不需要在继续看了,但是考虑到部分朋友还是新手(包括自己)以及后面复习,还是稍微唠叨一段。

update过程

首先,上图中深色背景的表示在执行器中执行,也就是Server层,浅色的是在InnoDB引擎中执行。
由于很多朋友并不是专业的DBA或者对MySQL内部原理并不是特别清晰,所以先对redologbinlog做简单的介绍。

  • redolog

    重做日志,属于物理日志,上面存储的是数据库中最终的内容,有固定的大小,可以循环读写,一般设置innodb_flush_log_at_trx_commit为1,表示commit事务时将redolog上面的数据刷入到磁盘(具体的可以自行研究redolog file 和redolog buffer)。具有两个状态分别是preparecommit,在MySQL重启恢复时会根据commit状态恢复数据。

  • binlog

    归档日志,属于逻辑日志,上面存储的是最初的修改逻辑可以简单的理解为sql语句,可以追加写,一般设置sync_binlog为1,表示commit事务时将binlog上面的数据刷入到磁盘进行归档。数据恢复和同步都是通过binlog来实现的。

下面以文字的方式再次描述一下update T set value = value+1 where ID =2的过程。

  1. 词法分析器识别出事update语句;
  2. 执行器去InnoDB中进行查询,找到满足ID = 2 的数据;
  3. 执行器将value的值加1;
  4. 执行器让InnoDB将刚刚的新值写入到InnoDB的内存中;
  5. InnoDB在redolog中加入一条记录,并把该记录的状态设置为prepare;
  6. 执行器经“update T set value = value+1 where ID =2” 写入到binlog中;
  7. 此时提交事务,将redolog中prepare的的记录状态设为commit,并且将内存中的新数据刷入磁盘。

以上就是比较简单的过程理解,那么为啥要分开写redolog呢?即传说中的两阶段提交?这里再做个简单的分析。

首先对这种方式的好处做个总结:保证以上所有的过程如果出现MySQL实例奔溃都不会导致事务的丢失或异常。

接下来分析一下这么做的具体原因:

  1. 如果是第5步之前crash,就是还没写任何日志,那么事务就不存在,在恢复后从redolog和binlog中都不会有任何的问题;
  2. 如果写完redolog 的prepare出现了crash,那么恢复时,通过redolog和binlog的对比,会发现只要一个prepare的日志,那么会将事务进行回滚,保证redolog和binlog的统一;
  3. 如果写完binlog后出现crash,那么恢复时,会进行根据binlog日志对redolog进行补偿,对redolog之前prepare的记录修改为commit状态,事务得到保证;
  4. 最后commit后crash,redolog和binlog都是正常的。

redolog只出现在InnDB中,而且是循环写的,不能持久保存,所以暂时不能用redolog来做主从或者数据备份

以上的是总结了很多博客和书上的内容,并不是完全的原创,自己也是在整理,希望大家能指正不对之处。

MySQL -update语句流程总结相关推荐

  1. MySQL UPDATE 语句一个“经典”的坑

    转载自  MySQL UPDATE 语句一个"经典"的坑 来源:ju.outofmemory.cn/entry/336774 有问题的SQL语句 why? 倒回去再重试验一把 最近 ...

  2. 零基础带你学习MySQL—Update语句以及注意事项(八)

    零基础带你学习MySQL-Update语句以及注意事项(八) 一.Update语句的基本语法 二.Update语句的注意事项

  3. MySQL——update 语句执行流程

    图1 update语句执行流程 从 Buffer Pool(内存中) 中查看是否有这条数据,没有就从磁盘中加载到缓冲池,然后对这行记录加独占锁: 把更新行记录的旧值写入 undo log(以便回滚): ...

  4. 谈谈mysql update语句 set顺序问题、列交换sql实现及多表更新注意事项

      绝大多数数据库,在执行sql update语句时,update t set a = b, b=a 便可实现ab列值互换,赋值表达式右侧的值取的都是原始值.mysql则是例外,其单表更新是自左到右依 ...

  5. mysql update语句怎么写_mysql更新语句怎么写?

    MySQL更新语句也就是MySQL中的update语句,当我们需要更新或者修改表中的数据时,就会使用这个update语句,下面我们就来看一下mysql更新语句的具体写法. MySQL中update语句 ...

  6. mysql update语句卡死_oracle执行update语句时卡住问题分析及解决办法

    问题 开发的时候debug到一条update的sql语句时程序就不动了,然后我就在plsql上试了一下,发现plsql一直在显示正在执行,等了好久也不出结果.但是奇怪的是执行其他的select语句却是 ...

  7. MySQL#Update语句

    Update 语句 Update 语句用于修改表中的数据. 语法: UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 Person: LastName FirstName ...

  8. MySQL UPDATE语句

    # UPDATE语句用于修改表的记录 # 把每个员工的编号和上司的编号+1,用order by子句完成(提示按照降序来执行) UPDATE t_emp SET empno=empno+1,mgr=mg ...

  9. php mysql update语句_mysql SELECT FOR UPDATE 语句

    MySQL  使用SELECT - FOR UPDATE 做事务写入前的确认 以MySQL 的InnoDB 为例,预设的Tansaction isolation level 为REPEATABLE R ...

  10. mysql update语句set中用and条件连接两个操作

    原来的数据如下 执行的SQL语句如下 update sys_area set create_by = '2' and update_by = '2' where id = '1'; 执行结果为 原因 ...

最新文章

  1. 微信公众号为指定openid用户推送消息
  2. 【目标检测】(6) YOLOV2 目标检测在V1基础上的改进
  3. C++实现快速排序算法QuickSort()
  4. 为你写诗:3 步搭建 Serverless AI 应用
  5. 【已解决】R read.table()报错:incomplete final line found by readTableHeader
  6. 插入排序 希尔排序 C++
  7. 工作331:uni-修改未完成数据动态渲染
  8. 成人高考 计算机英语作文,2017年成人高考英语作文范文
  9. 计算机算法刘汉英PDF,操作系统原理(刘汉英)
  10. cloudsim的安装和配置
  11. Mono 2.11.3 发布包含微软的 Entity Framework
  12. (7) PyQt 设计并实现【工厂扫码装箱系统】- Python代码实现BarTender自动化打印条码标签
  13. 如何优雅的在微信小程序使用 SVG 字体图标
  14. Luat合宙ESP32C3教程-点亮ST7735驱动1.8寸TFT液晶屏
  15. 清明柳枝亭子小桥flash动画素材
  16. linux 基本操作
  17. 内网渗透-红队内网渗透工具(Viper)
  18. Post方法如何接受数组
  19. 情侣相处最佳模式(转)
  20. win7文件夹有个小锁怎么办 win7取消共享文件上小锁图标的方法

热门文章

  1. c++ map查找key
  2. Starling MovieClip API
  3. 统计文件中元音字母的数量
  4. 西班牙出差见闻之一(出发)
  5. onenote同步问题
  6. 用计算机求算术平方根,6.1用计算机计算算术平方根.ppt
  7. uniapp 开发小程序对象传递数据结构封装一层$orig,使组件中v-model绑定value失效
  8. 韩国历史最悠久的银行推出全国区块链贷款平台
  9. HTTP 401和403区别
  10. oracle 11 ora 12514,oracle 11g ORA 12514错误,我的解决办法