zoukankan      html  css  js  c++  java
  • MySQL两阶段提交

    1. MySQL常见的日志

      1. 错误日志:对MySQL的启动、运行、关闭过程进行记录。不仅记录了错误信息,还记录了一些警告信息或者正确信息

      2. 慢查询日志:记录超过设定阈值的慢SQL

      3. 查询日志:记录所有对数据库的请求信息,无论这些请求是否得到了正确执行

      4. 二进制日志:记录了对数据库执行更改的所有操作。主要用途是主从复制,数据恢复

      5. 重做日志:Innodb引擎层,记录了事务执行过程中对每个数据页的修改信息。主要用途是实现事务中的一致性

    2. 重做日志和二进制日志的区别

      1. 实现层级不同。重做日志是Innodb引擎独有的,二进制日志是MySQL Server层写入的

      2. 存储内容不同。二进制日志存储的是逻辑日志,重做日志存储的是物理日志

      3. 写入方式不同。重做日志是循环写入,文件总大小是固定。二进制日志可以追加写入。

    3. 二进制日志缓冲区

      MySQL为每个会话分配了一个二进制日志缓冲区,其大小有binlog_Cache_size控制,默认32K。当使用支持事务的存储引擎时,在一个事务中,对数据的修改操作会写入到缓冲区,在事务提交前,将缓冲区的内容写入到系统缓存。至于何时写入到二进制文件,是由sync_binlog控制的。sync_binlog = [N] 表示每写缓冲多少次就同步到硬盘。默认为0即有操作系统决定何时同步,设置为1,则每次提交都会写入硬盘。

    4. 二进制日志和数据库一致性问题

      当引擎支持事务时,为了保证高可用,sync_binlog需要设置为1。但是依然会有数据不一致的问题,比如事务提交会写入二进制文件,但是此时发生宕机,事务没有成功提交,那么二进制日志是无法回滚的。为了解决这个问题,MySQL提供了额外的配置项innodb_support_xa,设置为1来解决。了解分布式事务的应该知道XA协议,即两阶段提交协议。

    5.什么是数据库二阶段提交

      1. 准备阶段:刷新重做日志缓存到重做日志文件

      2. 提交阶段:刷新二进制文件缓存到二进制日志文件,将重做日志打上commit标识

    6.情况分析  

      1. 在重做日志文件写入前奔溃

      2. 在重做日志写入后,二进制文件写入时崩溃

      3. 在二进制文件写入后,commit标识设置前崩溃

      4. 在commit标识设置后崩溃

      对于情况1,重做日志还没写相当于这个事物没有执行

      对于情况2,数据库检查二进制文件格式发现不完整,回滚事物,这条记录在载入binlog时也因为异常而不会生效

      对于情况3,数据库检查二进制文件格式发现完整,提交事物

      对于情况4,发现重做日志已有commit标识,提交事物

      上述4种情况下,二进制文件和数据库都是一致的

    参考:https://cloud.tencent.com/developer/article/1699992 

    人生就像蒲公英,看似自由,其实身不由己。
  • 相关阅读:
    Python学习 之 流程控制
    Python学习 之 数据类型(邹琪鲜 milo)
    Python学习 之 运算符&表达式
    Python学习 之 编程
    Python学习 之 走进python
    [考试维护]之命名的规范 2015-07-04 21:11 871人阅读 评论(37) 收藏
    [考试维护]修改代码的感受 2015-06-29 11:38 635人阅读 评论(30) 收藏
    如无必要,勿增实体 2015-05-31 20:34 2142人阅读 评论(37) 收藏
    【英语月总】我真的意识到英语的重要性了吗 2015-05-30 21:08 884人阅读 评论(27) 收藏
    selenium测试(Java)--关闭窗口(二十)
  • 原文地址:https://www.cnblogs.com/walker993/p/14646103.html
Copyright © 2011-2022 走看看