就是ACID嘛,原子性、一致性、隔离性、持久性。 原子性指的是:事务的操作要么同时成功,要么同时失败。原子性有undo log日志来保证,因为undo log记载着数据修改前的信息。比如我们要insert一条数据,那undo log会记录一条delete日志,我们要update一条记录时,那undo log会记录之前的旧值的update记录。如果执行事务过程中出现异常的情况,那就执行回滚,InnoDB就是利用undo log记录的数据,来将数据恢复到事务开始之前。 隔离性指的是:在事务并发执行时,他们内部的操作不能互相干扰。如果多个事务可以在同一时刻操作同一份数据,那么就可能会出现脏读、不可重复读、幻读的问题。于是,事务与事务直接需要存在一定的隔离,在InnoDB引擎中,定义了四种隔离级别供我们使用:分别是读未提交、读已提交、可重复读、串行化,不同隔离级别对事务之间的隔离性是不一样的,级别越高事务的隔离性就越好,但性能就越低。 持久性指的是:一旦提交了事务,它对数据库的改变就应该是永久性。说白了就是数据会持久化在硬盘上。而持久化是由redo log日志来保证的,当我们要修改数据时,MySQL是先把这条记录所在的页找到,然后把该页加载到内存中,将对应记录进行修改。为了防止内存修改完了,MySQL就挂掉了,MySQL引入了redo log,内存写完了,然后会写一份redo log,这份redo log记载着这次在某个页上做了什么修改。即使MySQL中途挂掉了,我们还可以根据redo log来对数据进行恢复。(redo log是顺序写的,写入速度很快,并且它记录的是物理修改,文件的体积很小,恢复速度也很快。) 一致性可以理解为我们使用事务的目的,而隔离性、原子性、持久性均是为了保障一致性的手段,保证一致性还需要由应用程序代码来保证。比如,如果事务在发生的过程中,出现了异常情况,此时你就得回滚事务,而不是强行提交事务来导致数据不一致。