SQL更新语句的执行

联系上文SQL查询语句的执行

查询语句的那一套流程,更新语句也是同样会走一遍。

更新流程还涉及两个重要的日志模块:

? redo log(重做日志)和 binlog(归档日志)

redo log:重做日志

redo log是InnoDB引擎特有的日志

WAL技术,全称是Write-Ahead Logging

它的关键点就是先写日志,再写磁盘。

具体来说,当有一条记录需要更新的时候,InnoDB引擎就会先把记录写到redo log里,并更新内存,此时更新就算完成了。

同时,InnoDB引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候做。

write pos是当前记录的位置,一边写一边后移,写到末尾再从头开始。

checkpoint是当前要擦除的位置,擦除记录前要把记录更新到数据文件。

InnoDB就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe

binlog:归档日志

Server层也有自己的日志,称为binlog(归档日志)

两种日志的区别

  • redo log是InnoDB引擎特有的;binlog是MySQL的Server层实现的,所有引擎都可以使用。
  • redo log是物理日志,记录的是“数据页具体的修改”。binlog是逻辑日志,记录语句的原始逻辑(语句)
  • redo log是循环写的,空间固定会用完。binlog是可以追加写入的

prepare和commit,这就是"两阶段提交"。主要是用来保证一致性

1.prepare阶段,记录修改到redo log

2.真正的提交commit需要binlog成功之后。

3.如果binlog未开始或者不完整,事务会回滚。

原文地址:https://www.cnblogs.com/ginko/p/11609918.html

时间: 2024-10-09 17:57:16

SQL更新语句的执行的相关文章

MySQL数据库详解(二)一条SQL更新语句是如何执行的?

? 前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块.相信你还记得,一条查询语句的执行过程一般是经过连接器.分析器.优化器.执行器等功能模块,最后到达存储引擎. 那么,一条更新语句的执行流程又是怎样的呢?之前你可能经常听 DBA 同事说,MySQL 可以恢复到半个月内任意一秒的状态,惊叹的同时,你是不是心中也会不免会好奇,这是怎样做到的呢? 我们还是从一个表的一条更新语句说起,下面是这个表的创建语句,这个表有一个主键 ID 和一个整型字段 c: mysql> creat

浅谈SQL优化入门:1、SQL查询语句的执行顺序

1.SQL查询语句的执行顺序 (7) SELECT (8) DISTINCT <select_list> (1) FROM <left_table> (3) <join_type> JOIN <right_table> (2) ON <join_condition> (4) WHERE <where_condition> (5) GROUP BY <group_by_list> (6) HAVING <having_

Mysql实战45讲学习详情----一条SQL更新语句是如何执行的?

相关词语: redo log:日志模块(临时记录,类似于便签),InnoDB 引擎特有日志 WAL(Write-Ahead Logging):写入方式 binlog:日志模块(归档日志),Server 层的日志 crash-safe:redo log带来的好处(MySQL 可以恢复到固定时间内任意一秒的状态) WAL执行过程(redo log日志的存储方式): write pos 是当前记录的位置,checkpoint 是当前要擦除的位置,它们之间的是“便签”上还空着的部分.如果 write p

SQL更新语句,Error Code: 1175. You are using safe update(在进行视图更新的时候遇到)

转发于:http://blog.csdn.net/qq_26684469/article/details/51105188?locationNum=5&fps=1 原来的SET SQL_SAFE_UPDATES = 1; 如果条件定语从句where后面跟的不是主键,则会报上面的错,将上面的安全级别设低一点即可,如下: SET SQL_SAFE_UPDATES = 0; 再执行更新语句,如 SET SQL_SAFE_UPDATES = 0; update project.demand set ti

SQL查询语句的执行

执行过程 连接器 - 管理连接,权限验证 查询缓存 - 命中缓存直接返回结果 分析器 - 词法分析 ,语法分析 优化器 - 分析执行计划,选择最优的执行计划 执行器 - 操作存储引擎接口,返回结果 不同的存储引擎共用一个Server层 连接器 连接器负责跟客户端建立连接.获取权限.维持和管理连接 客户端如果太长时间没动静,连接器就会自动将它断开.这个时间是由参数wait_timeout控制. 连接断开后,继续需要重连才能执行客户请求. 通常数据库连接推荐使用长连接. 查询缓存 拿到一个查询请求后

MySQL中limit使用动态参数的解决方法(拼接SQL字符串语句来执行SQL)

官方好像说过limit已经在5.6版本上支持了动态参数,但是测试时依然还是不行. 那么要解决limit动态参数唯一能做的就是使用字符串SQL拼接的形式,然后再进行执行. 一般有以下方式解决: 1.存储过程拼接 2.函数拼接 3.视图里拼接 4.当前查询的session中使用 其实上面都是同一个意思,就是使用一个变量存取这个SQL,然后再执行这个变量. 样例: set @stmt = concat('select * from ',table_name,' limit ?,?'); prepare

C# 执行多条SQL更新语句,实现数据库事务

class Program { class Result<T> { public T data; public string Message; public bool Success; public string StackTrace; } struct ExecuteableUnit { public string SQL; public SqlParameter[] param; } /// <summary> /// 执行多条SQL语句,实现数据库事务. /// </s

02 | 日志系统:一条SQL更新语句是如何执行的?

redo log 和 bin log redo log 是innodb引擎特有,当有一条记录需要更新时,innodb先把记录写到redo log中,并更新内存,此时更新完成, 同时,innodb会在适当的时候把这个操作记录更新到磁盘中. binlog(归档日志)是server层的日志 这两种日志有以下三点不同: redo log 是 InnoDB 引擎特有的:binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用. redo log 是物理日志,记录的是“在某个数据页上做了

sql 更新语句

update ms_cf01 set yfsb=1 from ms_cf01 where yfsb=3; 对一个表数据进行更新操作可以把from [表名]省略. 用from 时一般是从别的关联表中取数据更新时用 如update [表1] set [列名]=b.[列名]FROM [表1] a,[表2] bwhere a.[关联列]=b.[关联列]