事务的隔离性由锁机制实现
事务的原子性、一致性、持久性由事务的redo 日志 和 undo 日志 保证
**redo log **是事务持久性的保证
undo log 是事务原子性的保证
redo log 是存储引擎层(innodb)生成的日志,记录的是物理级别上的页修改操作,比如页号xxx、偏移量yyy 写入了zzz数据,主要保证数据的可靠性
undo log 是存储引擎层(innodb)生成的日志,记录的是逻辑操作日志,比如对某一行数据进行了insert语句操作,那么undolog 就记录 一条与之相反的delete操作,主要用于 事务回滚(undo记录的是每个修改操作的逆操作)和一致性非锁定读(undo log 回滚行记录到某种特定的版本mvcc,即多版本并发控制)
redo日志是顺序写入磁盘的
在执行事务的过程中,每执行一条语句,就可能产生若干条redo日志,这些日志是按照产生的顺序写入磁盘的,也就是使用顺序IO。
Redo log可以简单分为以下两个部分:
一是内存中重做日志缓冲 (redo log buffer),是易失的,在内存中
二是重做日志文件 (redo log file),是持久的,保存在磁盘中
设置 查看 buffer 大小
show variables like ‘innodb_log_buffer_size’;
刷盘策略
查看参数 innodb_flush_log_at_trx_commit;
show variables like ‘innodb_flush_log_at_trx_commit’;
page cache
** innodb 引擎 后台线程 **
事务提交时必须调用一次 fsync 操作,最安全的配置,保障持久性
事务提交时只做 write 操作,只保证将redo log buffer写到系统的页面缓存中,不进行fsync操作,因此如果MySQL数据库宕机时 不会丢失事务,但操作系统宕机则可能丢失事务
undo log 类型:
undo 日志的作用
redo log 是事务持久性的保证
undo log 是事务原子性的保证
在事务中 更新数据的前置操作 其实是要先写入一个 undo log
undo log 会产生 redo log,也就是 undo log的产生会伴随着redo log 的产生,这是因为undo log也需要持久性的保护。
实际上当进行数据修改时不光要记录到undo中,使用undo这个动作还要记录到redo中,同Oracle中相似,在使用undo回滚时也会产生一定量的信息记录redo,总之,不管不管innodb怎样使用undo 这个信息都是要记录redo的。
下面是redo log + undo log的简化过程,便于理解两种日志的过程:
假设有A、B两个数据,值分别为1,2.