MySQL事务的作用呢,就是要保证数据库的可靠性、一致性、并发处理。那实现事务需要三个技术,分别是日志文件,包括redo log 和 undo log、锁技术、MVCC。
那什么是redo log呢,redo log是用来记录已提交事务的修改语句的,因为数据库为了保证效率,每次修改操作,并不会马上落盘,而是会先存放到内存缓冲区中,这样的话就有一个问题,当服务器宕机的时候,内存数据就没了,这时候就用到了redo log,它可以保障已提交事务的持久化特性。
那什么是undo log呢,undo log是用来记录数据被修改前的信息,当发生回滚时,可以根据undo log回滚到没被修改之前的状态。
锁技术是指读写锁,通过读写锁,可以做到读读可以并行,但是不能做到写读,写写并行。
MVCC (MultiVersion Concurrency Control) 叫做多版本并发控制,InnoDB的 MVCC ,是通过在每行记录的后面保存两个隐藏的列来实现的,这两个列,一个保存了行的创建时间,一个保存了行的过期时间,当然存储的并不是实际的时间值,而是系统版本号,他的主要实现思想是通过数据多版本来做到读写分离。从而实现不加锁读进而做到读写并行.。
MVCC在mysql中的实现依赖的是undo log与read view,undo log 中记录的是某行数据的多个版本的数据。read view 用来判断当前版本数据的可见性。
事务有四个特性,分别是
-
原子性(Atomicity)
-
一致性(Consistency)
-
隔离型(Isolation)
-
持久性(Durability)
那MySQL是怎么保证这4个特性的呢
- 原子性:使用 undo log ,从而达到回滚
- 持久性:使用 redo log,从而达到故障后恢复
- 隔离性:使用锁以及MVCC,运用的优化思想有读写分离,读读并行,读写并行
-
事务的终极大 boss 一致性是通过原子性,持久性,隔离性来实现的!!!通过回滚,以及恢复,和在并发环境下的隔离做到一致性。
原子性,持久性,隔离性的目的也是为了保障数据的一致性!
总之,ACID只是个概念,事务最终目的是要保障数据的可靠性,一致性。
参考