一、什么是事务事务:是数据库操作的最小工作单元 , 是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交 , 要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元);
事务的四大特性:
- 原子性(Atomicity):事务是数据库的逻辑工作单位 , 事务中包含的各操作要么都做 , 要么都不做
- 一致性(Consistency):事务开始前和结束后 , 数据库的完整性约束没有被破坏。比如A向B转账 , 不可能A扣了钱 , B却没收到 。
- 隔离型(Isolation):一个事务的执行不能被其它事务干扰 。即一个事务内部的操作及使用的数据对其它并发事务是隔离的 , 并发执行的各个事务之间不能互相干扰 。
- 持久性(Durability):指一个事务一旦提交 , 它对数据库中的数据的改变就应该是永久性的 。接下来的其它操作或故障不应该对其执行结果有任何影响 。
可靠性:原子性、一致性、持久性可以归纳为可靠性 。可靠就是要保证数据的一致与不丢失 。数据库要保证数据的一致 , 就要处理commit与rollBack;显然处理commit指令的时候需要记录要提交哪些数据 , rollback的时候需要知道回退的原数据 。MySQL中commit需要redo log , rollBack 对应undo log
并发控制(隔离性):当多个并发请求过来 , 并且其中有一个请求是对数据修改操作的时候会有影响 , 为了避免读到脏数据 , 所以需要对事务之间的读写进行隔离 , 至于隔离到啥程度得看业务系统的场景了 , 实现这个就得用MySQL 的隔离级别 。
二、redo log 与undo log1、redo log
redo log和undo log都属于InnoDB的事务日志 。redo log 主要实现数据的持久化
文章插图
InnoDB作为MySQL的存储引擎 , 数据是存放在磁盘中的 , 但如果每次读写数据都需要磁盘IO , 效率会很低 。为此 , InnoDB提供了缓存(Buffer Pool) , Buffer Pool中包含了磁盘中部分数据页的映射 , 作为访问数据库的缓冲:当从数据库读取数据时 , 会首先从Buffer Pool中读取 , 如果Buffer Pool中没有 , 则从磁盘读取后放入Buffer Pool;当向数据库写入数据时 , 会首先写入Buffer Pool , Buffer Pool中修改的数据会定期刷新到磁盘中(这一过程称为刷脏) 。Buffer Pool的使用大大提高了读写数据的效率 , 但是也带了新的问题:如果MySQL宕机 , 而此时Buffer Pool中修改的数据还没有刷新到磁盘 , 就会导致数据的丢失 , 事务的持久性无法保证 。
如上图所示mysql采用redo log来处理该问题:当数据修改时 , 除了修改Buffer Pool中的数据 , 还会在redo log Buffer 中记录这次操作;当事务提交时 , 会调用fsync接口对redo log进行刷盘 。如果MySQL宕机 , 重启时可以读取redo log中的数据 , 对数据库进行恢复 。redo log采用的是WAL(Write-ahead logging , 预写式日志) , 所有修改先写入日志 , 再更新到Buffer Pool , 保证了数据不会因MySQL宕机而丢失 , 从而满足了持久性要求 。MySQL支持用户自定义在commit时如何将log buffer中的日志刷log file中 。这种控制通过变量
innodb_flush_log_at_trx_commit 的值来决定 。该变量有3种值:0、1、2 , 默认为1 。但注意 , 这个变量只是控制commit动作是否刷新log buffer到磁盘 。
- 当设置为1的时候 , 事务每次提交都会将log buffer中的日志写入os buffer并调用fsync()刷到log file on disk中 。这种方式即使系统崩溃也不会丢失任何数据 , 但是因为每次提交都写入磁盘 , IO的性能较差 。
- 当设置为0的时候 , 事务提交时不会将log buffer中日志写入到os buffer , 而是每秒写入os buffer并调用fsync()写入到log file on disk中 。也就是说设置为0时是(大约)每秒刷新写入到磁盘中的 , 当系统崩溃 , 会丢失1秒钟的数据 。
- 当设置为2的时候 , 每次提交都仅写入到os buffer , 然后是每秒调用fsync()将os buffer中的日志写入到log file on disk 。
推荐阅读
- Wps中如何快速突显重复值?
- 如何成为一名后端开发工程师
- 螃蟹怎样挑选肥的 如何挑选螃蟹肥瘦
- 衣服染色用84怎么洗掉 84染色的衣服怎么洗掉如何用墨水上色
- 薄荷饮品的制作,如何制作薄荷红茶
- 如何成功转行AI算法工程师
- 浅表性胃炎如何根治,慢性浅表性胃炎六如何根治
- 如何用python实现自动化办公
- 如何把青香蕉变成黄香蕉 香蕉发青怎么变黄
- 如何用三明治机煎蛋 三明治机怎么煎鸡蛋吗