事务由一组sql语句组成
ACID
原子性:
指整个数据库事务是不可分割的工作单位,要么都做,要么都不做。只有使事务中所有的数据库操作都执行成功,才算整个事务成功/
一致性:
指事务将数据库从一种状态转变微下一种一致的状态。
隔离性:
事务提交前对其他事务都不可见,通常使用锁来实现
持久性:
事务一旦提交,其结果就是永久的,即使发生宕机等事故,数据库也能将数据恢复.
事务的隔离性---》由锁来实现
事务的原子性和持久性---》 由 redo log (重做日志) 实现,redo恢复提交事务修改的页操作
事务的一致性--》由undo log 实现,undo回滚到某个特定的版本
redo log 基本上只需要写入
undo log 需要进行随机读写
事务提交(COMMIT)时,必须将该事务的所有日志文件写入重做日志文件进行持久化
Mysql中还有一种二进制日志(binlog)
Mysql数据库上层的--》bin log是一种逻辑日志,记录的是对应的SQL语句!
Innodb存储引擎层的--》redo log是物理格式日志,记录的是对每个页的修改!
binlog仅在事务提交时记录,每一个事务只包含一个日志
redolog由于记录的是物理操作日志(对每个页的修改),所以每个事务对应多个日志条目,并且redolog的写是并发的,时间顺序不定
重做日志都是以512字节存储的,这意味着重做日志缓存,重做日志文件都是以块(block)的方式进行保存的,称为重做日志块(redo block)
若一个页中的重做日志数量大于512字节,需要分割为多个重做日志块存储
重做日志文件存储的就是之前在log buffer中保存的log block,因此,它也是根据块的方式进行物理存储的管理。
在Innodb存储引擎运行的过程中,log buffer根据一定的规则将内存中的log block刷新到磁盘,具体规则包括:
1.事务提交时
2.当log buffer中有一半内存空间已经被使用时
3. log checkpoint 时
LSN:日志序列号
undo
作用:
1.回滚。当执行rollback时,就可以从undo log中的逻辑记录读取到相应的内容并进行回滚。
2.MVCC。当读取的某一行被其他事务锁定时,它可以从undo log中分析出该行记录以前的数据是什么,从而提供该行版本信息,让用户实现非锁定一致性读取。
事务的回滚需要undo,undo存放在数据库内部的一个特殊段--》undo segment中,undo 段位于共享表空间。
注意:undo是逻辑日志,因此,回滚知识将数据逻辑的恢复到原来的样子,所有的修改都被逻辑的取消了
例如:用户执行了insert 10w条记录的事务---》表空间会增大,但用户执行rollback时,表空间的大小并不会因此缩小!
innodb的回滚,它实际上做的是与之前相反的操作:
对于每个insert--->innodb执行一个delete
对于每个delete--->innodb执行一个insert
对于每个update--->innodb执行一个相反的update.
注意undo log也会产生 redo log!!
其他参考资料:https://www.cnblogs.com/f-ck-need-u/archive/2018/05/08/9010872.html#auto_id_14