更新 user 表中 id=1 的这条数据,它的大致流程如上:
● 1、客户端连接到MySQL服务器,将SQL更新语句发送到服务器;
MySQL服务器连接池中会有一个连接和客户端建立连接,然后后台线程会从连接中获取到要执行的SQL语句,并发送给SQL接口去调度执行。
● 2、增、删、改 时,会将查询缓存中 user 表相关的缓存都清空。
● 3、SQL语句经过SQL解析器解析、优化器优化,得到一个执行路径,前面这些和执行查询其实都是类似的。
● 4、接着由执行引擎去调用底层的存储引擎接口,根据执行计划完成SQL语句的执行。
○ 首先查询出要更新的数据,这一步会先判断缓冲池(Buffer Pool)中是否已经存在这条数据,如果已经存在了,则直接从缓存池获取数据返回。否则从磁盘数据文件中加载这条数据到缓冲池中,再返回数据。
○ 获取到数据后,执行引擎会根据SQL更新数据,然后调用存储引擎更新数据。这一步会对数据加排它锁,避免并发更新问题。之后先写 undolog 到缓冲池,undolog 主要用于事务回滚、MVCC等;同时,undolog 也会产生 redolog 日志。
○ 之后更新缓冲池中的数据,同时记录 redolog 到 RedoLog缓冲池,redolog 主要用于保证数据的持久性,宕机恢复数据等。
○ 最后提交事务,虽然没有手动 commit 提交事务,update 语句执行完成后也会有隐式的事务提交的。事务提交时,会先在MySQL服务器层面会写入 binlog,binlog是数据持久性的保证。最后将redolog刷入磁盘,完成事务提交。
● 5、最底层的一部分就是磁盘上的数据文件、日志文件等,可以看到,InnoDB 设计了缓冲池来缓冲数据、undolog、redolog 等,这些内存中的数据最终都是要刷新到磁盘中才能保证数据不丢失的。
事务特性:
○ 原子性
■ 指一个数据库事务中的所有操作是不可分割的单元,只有事务中所有的数据库操作都执行成功,才算整个事务成功。事务中任何一个SQL语句执行失败,已经执行成功的SQL语句也必须撤销,数据库状态应该退回到执行事务前的状态
○ 一致性
■ 指事务将数据库从一种状态转变为下一种一致的状态。在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
○ 隔离性
■ 也叫 并发控制、可串行化、锁等。事务的隔离性要求每个读写事务的对象对其他事务的操作对象能相互分离,即该事务提交前对其他事务都不可见,通常这使用锁来实现
○ 持久性
■ 要求事务一旦提交,其结果就是永久性的。即使发生宕机等故障,数据库也能将数据恢复
事务分类:
● 扁平事务(Flat Transactions)
● 带有保存点的扁平事务(Flat Transactions with Savepoints)
● 链事务(Chained Transactions)
● 嵌套事务(Nested Transactions)
● 分布式事务(Distributed Transactions)
对于InnoDB存储引擎来说,其支持扁平事务、带有保存点的事务、链事务、分布式事务。对于嵌套事务,其并不原生支持。
1、扁平事务
扁平事务是事务类型中最简单的一种,也是使用最为频繁的事务。在扁平事务中,所有操作都处于同一层次,由 BEGIN/START TRANSACTION 开始,由 COMMIT 或 ROLLBACK 结束,其间的操作是原子的。
2、带有保存点的扁平事务
带有保存点的扁平事务允许在事务执行过程中回滚到同一事务中较早的一个状态。我们可以在事务过程中设置一些保存点(Savepoint),保存点用来通知系统应该记住事务当前的状态,以便当之后发生错误时,事务能回到保存点当时的状态。
对于扁平事务来说,其在事务开始的时候隐式地设置了一个保存点,扁平事务就只有这一个保存点,因此,回滚只能回滚到事务开始时的状态。
可以通过 SAVEPOINT 创建一个保存点,ROLLBACK TO SAVEPOINT 回滚到某个保存点。
3、链事务
链事务就是一个事务在提交的时候自动将上下文传给下一个事务,也就是说一个事务的提交和下一个事务的开始是原子性的,下一个事务可以看到上一个事务的结果,就好像在一个事务中进行的一样。
链事务可视为保存点模式的一种变种,不同的是,带有保存点的扁平事务能回滚到任意正确的保存点,而链事务中的回滚仅限于当前事务。
MySQL 的链式事务可以通过 SET completion_type = 1 打开。
4、嵌套事务
嵌套事务是一个层次结构框架,由一个顶层事务控制着各个层次的事务。顶层事务之下嵌套的事务被称为子事务,其控制每一个局部的变换。子事务提交后不会真的提交,而是等到父事务提交才真正的提交,父事务回滚了,会回滚所有子事务。
MySQL 不支持嵌套事务,不过我们可以通过带有保存点的事务来模拟串行的嵌套事务。
5、分布式事务
分布式事务通常是一个在分布式环境下运行的扁平事务,需要根据数据所在位置访问网络中的不同节点。