当前位置:文档之家› mysql事务实现-隔离级别-

mysql事务实现-隔离级别-

若一个页中产生的重做日志大于512字节,那么需要分割为多个重做日志块来存储。此外,重做日志块的大小 和磁盘扇区大小一样,都是512字节,因此重做日志的写入可以保证原子性。
恢复
LSN(重做日志写入总量、checkpoint的位置、页的版本)存在与重做日志和页中。 例如:页P1的LSN为10000,数据库启动时,InnoDB检测到写入重做日志中的LSN为13000,并且该事务已经提交, 那么数据库需要恢复操作,将重做日志应用到P1页中。当重做日志中LSN小于P1的LSN,则不需要重做。
事务的实现
o log保证事务的一致性。
redo Redo log buffer 重做日志缓冲,内存中易丢失
Redo log file 重做日志文件,持久的 事务提交时,必须将该事务的所有日志写入到日志文件,保证事务持久性。 Innodb_flush_log_at_trx_commit 默认1,事务提交必须进行一次fsync操作,确保从操作系统文件刷入磁盘。 设置为0,master thread 每1秒进行一次fsync操作。设置2,事务提交时,写入日志,但只写入文件系统缓存, fsync操作
设置2,数据库宕机不会丢事务,操作系统宕机会丢事务。 设置为0或者2,可以提升程序性能,但有丢数据的风险。
二进制日志(binlog)对比重做日志 内容形式不同,二进制日志是一种逻辑日志,记录对应SQL语句,是MYSQL数据库上层日志,任何存储引擎都会 产生二进制日志。InnoDB存储引擎的重做日志,记录的是物理操作日志,每个事务对应多个日志条目,事务的重 做日志写入是并发的,并非在事务提交时写入。
重做日志是物理日志,是幂等的。
有的DBA认为只要将二进制日志格式设置为ROW,那么二进制日志也是幂等的,是错误的,INSERT操作在二进 制日志中就不是幂等的,重复执行可能插入多行记录。
InnoDB事务原子性的保证
Log block
重做日志以512字节进行存储,重做日志缓存和文件都以块(block)的方式进行保存,称为重做日志块(redo log block)
undo
Undo存放在数据库内部的一个特殊段,这个段称为undo段,位于共享表空间内。
用途: 1、回滚,例如insert事务,表空间会变大,当执行rollback时,会将插入的事务回滚,但表空间大小不会收缩。因 此,insert,回滚,innoDB会执行一个delect操作,对于update,会执行一个反向的update。
2、MVCC,当用户读取一行记录时,若该记录已被其他事务占用,当前事务可以通过undo读取之前的版本信息, 以此实现非锁定读。
最后undo log也会产生redo log,实现持久性。
相关主题