概述
事务的特性(ACID)
原子性:事务是不可分割的操作单元,要么全部成功,要么全部失败。
一致性:事务结束时,所有数据都必须保证一致状态。
隔离性:事务在独立环境运行,不会受到外部的并发操作的影响
持久性:事务一旦提交或回滚,他对数据的改变是永久性的。(保存在磁盘中)
以转账为例:假设A向B转账100元。则A账户-100,B账户+100。
原子性则保证A账户-100,B账户+100操作要么都成功,要么都失败。
一致性保证A账户必须-100,B账户必须+100。
并发事务产生的问题以及解决办法
并发事务主要产生的问题
脏读、不可重复读和幻读的区别为:脏读中A事务读取了B事务还未提交的数据。不可重复读中A事务要对某一数据读取两次,在这两次间隔中,B事务对相应的数据进行了修改。幻读简言之是查数据时没找到该数据,但是后来插入时发现数据已存在。
解决方法
解决方案就是对事物进行隔离。从上到下隔离级别越高,但是性能越低。Mysql默认的事务隔离级别为可重复读。
redo log与undo log日志文件(redo保证持久性、undo保证原子性和一致性)
首先先了解缓冲池和数据页的概念:
缓冲池是内存一片空间,当数据库执行增删改查时,可先操作缓冲池中的数据(没有的话就将数据从磁盘加载到缓冲池),从而减少磁盘I/O。
数据页是数据库最小的存储单元,一个数据页存储一行记录。
那么如果缓存中的数据没有提交到磁盘更新时,系统发生故障,此时缓存中的数据会丢失,从而无法保证事务的持久性,此时就需要日志文件对数据进行恢复。
redo log日志文件
undo log日志文件
二者区别
多版本并发控制mvcc(保证事物的隔离性)
如果有多个事务对同一数据进行写操作,那么会产生这个数据的不同版本,当某个事物需要读取这个数据时,mvcc会自动呈现给用户正确版本的数据从而保证事物的隔离性。
总结
事务的特性
原子性:事务是不可分割的操作单元,要么全部成功,要么全部失败。
一致性:事务结束时,所有数据都必须保证一致状态。
隔离性:事务在独立环境运行,不会受到外部的并发操作的影响
持久性:事务一旦提交或回滚,他对数据的改变是永久性的。(保存在磁盘中)
并发事务产生的问题以及解决办法
解决方案就是对事物进行隔离。Mysql默认的事务隔离级别为可重复读。
redo log与undo log日志文件
见上面
MVVC
如果有多个事务对同一数据进行写操作,那么会产生这个数据的不同版本,当某个事物需要读取这个数据时,mvcc会自动呈现给用户正确版本的数据从而保证事物的隔离性。