1.mysql原子性的保证是利用了undo log。undo log名为回滚日志,是实现原子性的关键,当事务回滚时可以撤销全部已经成功执行的sql语句,他须要记录你要回滚的相应日志信息。undo log记录了这些回滚须要的信息,当事务执行失败或调用了rollback,致使事务须要回滚,即可以利用undo log中的信息将数据回滚到修改以前的样子。mysql
2.mysql持久性的保证是利用了redo log。Mysql是先把磁盘上的数据加载到内存中,在内存中对数据进行修改,再刷回磁盘上。若是此时忽然宕机,内存中的数据就会丢失。redo log包括两部分:一是内存中的日志缓冲(redo log buffer),该部分日志是易失性的;二是磁盘上的重作日志文件(redo log file),该部分日志是持久的。innodb经过force log at commit机制实现事务的持久性,即在事务提交的时候,必须先将该事务的全部事务日志写入到磁盘上的redo log file和undo log file中进行持久化。sql
3.mysql一致性的保证是从2个方面来保证的。从数据库层面来看,A(原子性)、I(隔离性)、D(持久性)是手段,是为了保证一致性,数据库提供的手段。数据库必需要实现AID三大特性,才有可能实现一致性。数据库
可是,若是你在事务里故意写出违反约束的代码,一致性仍是没法保证的。例如,你在转帐的例子中,你的代码里故意不给B帐户加钱,那一致性仍是没法保证。所以,还必须从应用层角度考虑。从应用层面,经过代码判断数据库数据是否有效,而后决定回滚仍是提交数据!app
mysql保证一致性、原子性和持久性的参考https://blog.csdn.net/xmt1139057136/article/details/104912243。ide
redo log和undo log参考https://juejin.im/entry/6844903681091977229。ui