MySQL-事务

MySQL-事务

  • 事务定义

    • 事务就是一组原子性的SQL查询语句,要么全部执行成功、要么全部执行失败。
  • ACID

    • 一个良好的事务数据库系统,必须具备ACID特性。

    • 原子性(Atomicity)要么全部执行、要么全部不执行
      一致性(Consistency)事务开始和结束时,数据必须保证一致性
      隔离性(Isolation)事务处理过程中、中间状态对其他事务不可见
      持久性(Durability)事务完成后、它对数据的修改时永久性的
  • 事务隔离级别

    • MySQL有四种隔离级别。

    • Read Uncommitted读未提交所有事务可以看到其他未提交事务的执行结果
      Read Committed读已提交事务只能看到已提交事务所做的改动
      Repeatable Read可重复读默认的隔离级别
      Serializable串行强制事务排序、一次只执行一个事务
  • 并发问题

    • 脏读事务读到了其他未提交的事务修改的数据,此数据可能因回滚而作废。
      不可重复读事务多次读取同一数据,返回的结果不同。
      幻读事务多次读取同一数据,返回的结果条数不同。
    • 不可重复读和幻读区别:

      • 不可重复读:针对其他事务提交前后,对行的修改来说。
      • 幻读:针对其他事务提交前后,对行的增删来说。
    • 不同隔离级别下的并发问题

      • 脏读不可重复读幻读
        读未提交
        读已提交×
        可重复读××x(注)
        串行×××
      • 针对可重复读级别下的幻读问题,mysql的Innodb引擎中已经通过MVCC(快照读情况)和next-key锁(当前读情况)来避免了幻读。

  • Redo Log

    • Redo Log被称作重做日志,用于记录事务操作变化,记录数据修改后的值,保证断电恢复。
    • 由内存中的重做日志缓冲重做日志文件构成。
    • 在实际数据文件的修改落盘之前redo日志已经落盘,从而来保证事务的持久性。
    • 在事务中发送修改时,将修改更新到内存后,会在重做日志缓冲添加此修改的操作记录,等到提交事务时,会将重做日志缓冲添加的记录的状态都置为commit状态,之后根据写入策略将commit的记录写入磁盘中的重做日志文件中,此时事务commit成功,并在之后慢慢将数据刷入硬盘中。
    • 因此即使数据库断电,提交成功的事务也已经存入硬盘中的重做日志文件中了。
  • Binlog

    • Binlog记录了所有的DDL和DML语句,但不包括select、show等查询语句。
    • Binlog用于:数据恢复、主从复制、审计数据变化。
    • 可通过设置来决定多久刷新一次到硬盘中。
    • 先写redolog后写binlog,提交后再将redolog记录改为commit
  • Redo Log与Binlog

    • (1)redo log的大小是固定,被刷入磁盘的日志会被覆盖掉,因此无法用于数据回滚/数据恢复等操作。binlog通过追加的方式写入的,可通过配置参数max_binlog_size设置每个binlog文件的大小,当文件大小大于给定值后,日志会发生滚动,之后的日志记录到新的文件上。
    • (2)redo log是innodb引擎层实现的,并不是所有引擎都有。binlog是server层实现的,意味着所有引擎都可以使用binlog日志
  • Undo Log

    • Redo Log记录了事务操作变化,用于回滚。
    • 用于MVCC,读取一行记录时,若已被其他事务占据,则通过undo读取之前的版本。
    • 数据行中存在一个undo log的指针,指向之前历史数据在undo log中的位置。
  • MVCC

    • MVCC多版本并发控制,MVCC可以实现在事务中读取到在其他未提交事务修改的行的之前的数据,实现了读不加锁,读写不冲突提高了并发性。

    • MySQL中的MVCC只在Innodb的RR、RC两个隔离级别下启用。

    • MVCC实现原理

      • 更新操作就奖原记录放入undo log新行数据的undo log指针指向原数据,其他查询操作就通过查询undo log指针指向的行数据来找到历史版本。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值