InnoDB引擎——7.事物篇
众所周知,数据库的事物非常重要
上篇介绍锁,讨论了事物的隔离性,本章关注事物的原子性。
InnoDB引擎默认是READ REPEATABLE隔离级别.
隔离性=并发控制=可串行化=锁等
事物类型:(1)扁平事物(2)带有保存点的扁平事物(3)链事物(4)嵌套事物(5)分布式事物
(1)扁平事物是最简单的一种,所有操作处于同一层次。
(2)带有保存点的扁平事物,保存点用来通知系统应该记住当前事物的状态,以便回滚的时候,能回到保存点。SAVA WORK函数
(3)链式事物的思想是:在提交一个事物时,释放不需要的数据对象,将必要的处理上下文隐式的传给下一个要开始的事物。注意:提交事物和开始下一个事物合并为一个原子操作,链式事物的回滚仅限于当前事物,只能恢复到最近的一个保存点。
(4)嵌套事物:由一个顶层事物控制着各个层次的事物,顶层事物下嵌套的事物被称为子事物。想要实现事物间的并行性,需要真正支持的嵌套事物。
(5)分布式事物:在一个分布式系统中运用扁平事物,因此,需要根据数据所在位置访问网络中的不同节点。
InnoDB引擎支持扁平事物,带有保存点事物,链事物,分布式事物。
事物的隔离性由锁来实现,ACD由redo log,和undo log来完成,redo log保证事物的原子性和持久性,undo log用来保证事物的一致性。
redo恢复提交事物修改的页操作,而undo回滚行记录到某个特定的版本,redo通常是物理日志,记录的是页的物理修改操作,undo是逻辑日志,根据每行记录进行记录。
redo log用来保证事物的持久性,undo log 用来帮助事物回滚及MVCC功能。
innodb_flush_log_at_trx_commit可以设置为0或2来提高事物的提交性能(但是)
还有一种二进制日志,用来进行(PIT)的恢复和主从复制环境的建立
log block都是以512字节进行存储的,重做日志块大小和磁盘扇区大小一样都是512字节。(InnoDB引擎存储管理是基于页的)
LSN(Log Sequence Number):日志序列号。记录的是重做日志的总量。
undo:对数据库修改时,不但会产生redo,还会产生一定量的undo。redo存放在重做日志文件中,undo存放在数据库内部一个特殊段中,这个段称为undo段,undo段位于共享表空间内。undo是逻辑日志,所有修改都被逻辑取消了,但是数据结构和页本身在回滚之后可能大不相同。
undo还有一个作用就是MVCC,当用户读取一行时,若该记录已经被其他事物占用,当前事物可以通过undo读取之前版本的行版本信息,实现非锁定读取,undo log也会产生redo log,因为undo log也需要持久性的保护
待更新…