mysql事务实现-隔离级别-

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
设置2,数据库宕机不会丢事务,操作系统宕机会丢事务。 设置为0或者2,可以提升程序性能,但有丢数据的风险。
二进制日志(binlog)对比重做日志 内容形式不同,二进制日志是一种逻辑日志,记录对应SQL语句,是MYSQL数据库上层日志,任何存储引擎都会 产生二进制日志。InnoDB存储引擎的重做日志,记录的是物理操作日志,每个事务对应多个日志条目,事务的重 做日志写入是并发的,并非在事务提交时写入。
若一个页中产生的重做日志大于512字节,那么需要分割为多个重做日志块来存储。此外,重做日志块的大小 和磁盘扇区大小一样,都是512字节,因此重做日志的写入可以保证原子性。
恢复
LSN(重做日志写入总量、checkpoint的位置、页的版本)存在与重做日志和页中。 例如:页P1的LSN为10000,数据库启动时,InnoDB检测到写入重做日志中的LSN为13000,并且该事务已经提交, 那么数据库需要恢复操作,将重做日志应用到P1页中。当重做日志中LSN小于P1的LSN,则不需要重做。
重做日志是物理日志,是幂等的。
有的DBA认为只要将二进制日志格式设置为ROW,那么二进制日志也是幂等的,是错误的,INSERT操作在二进 制日志中就不是幂等的,重复执行可能插入多行记录。
Hale Waihona Puke Baidu InnoDB事务原子性的保证
Log block
重做日志以512字节进行存储,重做日志缓存和文件都以块(block)的方式进行保存,称为重做日志块(redo log block)
2、MVCC,当用户读取一行记录时,若该记录已被其他事务占用,当前事务可以通过undo读取之前的版本信息, 以此实现非锁定读。
最后undo log也会产生redo log,实现持久性。
事务的实现
事务的隔离性依靠锁来实现。 Redo log保证事务的原子性和持久性。 Undo log保证事务的一致性。
redo Redo log buffer 重做日志缓冲,内存中易丢失
Redo log file 重做日志文件,持久的 事务提交时,必须将该事务的所有日志写入到日志文件,保证事务持久性。 Innodb_flush_log_at_trx_commit 默认1,事务提交必须进行一次fsync操作,确保从操作系统文件刷入磁盘。 设置为0,master thread 每1秒进行一次fsync操作。设置2,事务提交时,写入日志,但只写入文件系统缓存, fsync操作
undo
Undo存放在数据库内部的一个特殊段,这个段称为undo段,位于共享表空间内。
用途: 1、回滚,例如insert事务,表空间会变大,当执行rollback时,会将插入的事务回滚,但表空间大小不会收缩。因 此,insert,回滚,innoDB会执行一个delect操作,对于update,会执行一个反向的update。
相关文档
最新文档