原子性(Atomic)
事务作为一个整体被执行,包含在事务中的对数据库的操作要么全部被执行,要么全部都不执行。
原子性是通过 undo log(回滚日志) 来保证的
持久性(Durability)
已被提交的事务对数据库的修改应该被永久保存在数据库中。
持久性是通过 redo log (重做日志)来保证的
隔离性(Isolation)
多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
隔离性是通过 MVCC(多版本并发控制) 或锁机制来保证的
一致性(Consistency)
事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足约束。比如A转账给B,那A扣100元,B一定相应增加100元
一致性则是通过持久性+原子性+隔离性来保证
事务隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也会越大。
read uncommitted(RU)读未提交
事务可以看到其他事务更改了但还没有提交的数据,即存在脏读的情况。
脏读(读到其他事务未提交的数据)
read committed(RC)读已提交
事务可以看到在它执行的时候,其他事务已经提交的数据。存在不可重复读现象,不存在脏读。
不可重复读(前后读取的数据不一致)
「读提交」隔离级别是在每个 select 都会生成一个新的 Read View,也意味着,事务期间的多次读取同一条数据,前后两次读的数据可能会出现不一致,因为可能这期间另外一个事务修改了该记录,并提交了事务。
repeatable read(RR)可重复读
得益于MVCC,同一个事务内,同一个查询请求,若多次执行,则获得的记录集是相同的,但不能杜绝幻读
幻读(前后读取的记录数量不一致)
MySQL InnoDB引擎默认使用的是repeatable read(可重复读),但它很大程度上避免了幻读(并不是完全避免,参考MySQL 可重复读隔离级别,完全解决幻读了吗? | 小林coding (xiaolincoding.com)),解决的方式有两种:
可重复读隔离级别是启动事务时生成一个 Read View,然后整个事务期间都在用这个 Read View。
serializable 串行化
serializable也称为序列化,最高级别的锁,它解决了幻读,它将锁施加在所有访问的数据上。
该锁将把普通的SELECT语句默认改成SELECT…LOCK IN SHARE MODE。