1. 原子性-Atomicity:一个流程中的操作不可分割,要么都做,要么都不做,使用 undo log这种逻辑日志实现回滚,保证原子性。
2.持久性-Durability: 保证数据持久化存储,为了保证数据库的IO速度,提交事务对数据的更改会临时存在缓存区中,然后按照一定机制(可能是定时)来把缓存中的数据写到磁盘中,如果发生机器故障内存中的数据会丢失,所以使用redo log 来保证持久性,每次对数据的修改都会记录到 redo log 中。因为写redo log是顺序IO,而写入修改的数据库数据是随机IO,所以写redo log会节省时间。
3.隔离性-Isolation:各个事务之间的操作互不影响。
隔离级别-解决的问题:
读未提交:会有脏读问题,一般不会使用
读已提交:Oracle的默认隔离级别,可以解决脏读问题,但是不能重复读(一个事物中两次读取相同的行,但是数据不一样)
可重复读:Mysql InnoDB存储引擎的默认隔离级别,会有幻读问题(一个事物中两次查询记录的行数不一样),但是InnoDB 的可重复读隔离级别解决了幻读问题(MVCC机制)
串行化:严格保证隔离性,但是效率低
MVCC:多版本并发控制(Multi-Version Concurrency Control),针对读-写并发场景,数据库的每条记录会有隐藏的三列来标记该记录的创建/更新版本号(事物版本号)、undo log的回滚指针、是否被删除的标记。每次读取数据时只读取比当前事物版本号小或者等于当前事物版本号的记录,如果发现版本号大于当前事物会根据undo log回滚到比当前事物版本号小的版本,保证读到的数据在事物开始时是存在的。
快照读:读到的数据可能是某一个版本,不一定是最新版本,一个的查询是当前读。
当前读:读到的数据一定是最新版本。
MVCC可以解决当前读的隔离性,不能解决快照读的隔离性
4.一致性-Consistency:当原子性、持久性、隔离性都得到保证后,才能保证数据的一致性。