innodb通过undo log和redo log来实现。
事务中,每当执行一条SQL语句对数据产生了影响,就会记录下来与之相反的 *** 作到undo log(撤销日志)中,例如,更新会记录之前的状态,删除会形成insert,添加会形成delete,一旦事务被回滚,则执行undo log中记录的 *** 作,来完成恢复到之前的状态。这里是个 逻辑恢复哦!同时,每当执行一条事务中的SQL,会将 *** 作记录到redo log中,此时事务一旦被提交,就将该redolog中的 *** 作,持久化到磁盘上,数据就持久的记录下来了(ACID的D)。
PS:还有,undolog才是原子性的关键。提供redolog,应该主要目的是提升磁盘的IO开销吧,如果直接写入磁盘,IO开销,会很大。如果先将 *** 作记录到redolog中,可以顺序的记录,批量的记录,再一起同步到磁盘上,速度会比直接写磁盘快些。 mysql在生成redolog时,会使用 innodb log buffer,先缓冲到内存中,再同步到redolog上,速度会更快。
另外关于,一致性,应该是个整体概念,保证所有的mysql对象(数据,索引,约束,日志,用户)在事务执行前后都具有完整的特性,应该是mysql所有的功能都为此服务吧!
1、原子性:在整个 *** 作的事务中,要么全部成功,要么全部失败。2、隔离性:所谓隔离性,就是每个事务执行的时候,相互之间不会受到影响,都是单独的事务。
3、一致性:也就是说事务在执行之后,必须和之前的数据保持一致。
4、持久性:事务一旦提交,就会持久化到数据库中,不能回滚。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)