mysql中innodb存储引擎是支持事务的,事物的四个特性ACID(原子性,一致性,隔离性,持久性)是如何实现的 ?下面记录一下自己的理解。
1.原子性
原子性:事务中的每个操作都是不可再分割的,要么全部执行成功,要么全部执行失败;事物的原子性保证了事务可以进行回滚操作。
事物的原子性是通过Undo Log来实现的,Undo Log是mysql提供的一种日志,每当一个事务对一条数据进行改动(增、删、改操作)时,Undo Log 就会记录当前改动的详细操作,也就是说每当事务对一条数据执行的SQL语句是增、删、改操作时,innodb都会把当前SQL语句执行的详细信息都给记录下来并存到Undo Log中,这样事务对数据的每次改动都会对应Undo Log中的一条记录日志。
Undo Log中的每条记录日志都会记录当前改动数据的事务是哪个(即事务ID),以及记录增、删、改中的哪种操作,同时还会有一个Roll_Pointer(行指针,主要用来指向Undo Log中下一条改动记录),通过Roll_Pointer就会得到一条行数据的版本链,版本链记录了每个事务对当前行数据改动时的详细操作;当某次事务执行SQL失败时,就会回滚到上一个版本,因为已经记录了本次执行SQL的详细信息,比如本次SQL操作是insert数据,但是可能程序中出现了错误,就需要进行回滚操作,也就是反向执行本次SQL即可实现回滚。下图为版本链的示意图,其中的每一行日志都记录了对当前行数据的详细改动操作。