数据库事务四大特性以及隔离级别
2018-07-25 本文已影响58人
BestbpF
一、事务四大特性(ACID)
事务可以理解为一系列操作的集合,如果一个数据库支持事务操作,则该数据库必须满足以下四个特性:
1. 原子性(Atomicity)
事务内包含的操作要么全部成功,要么全部回滚,如转账业务,不会出现一方扣钱而另一方没收到钱的情况。
2. 一致性(Consistency)
一个事务在执行前和执行后状态保持一致。依旧时转账业务,两个人的总账户金额一定,不管他俩之间如何转账交易,总账户金额总是不变的。
3. 隔离性(Isolation)
允许多个线程并发访问数据库,数据库会为每个线程开启独立的事务,一个事务的操作不能被其他的干扰,并发事务之间需要隔离。
数据库提供了多种隔离级别来解决不同的隔离问题(后面介绍)。
4. 持久性(Durability)
提交的事务会被永久保留在数据库中。
二、隔离级别
隔离级别是为了解决不隔离时出现的一系列问题,主要分为三种:脏读、不可重复读以及幻读。
1. 脏读
当事务A修改了某个数据但没有提交,事务B并发的访问了该数据,就会造成数据的读取不一致。依旧是转账业务:
- 操作1:A扣款1000
- 操作2:B加款1000
当事务A执行了操作1后,事务B发现A扣款了1000元,认为转账成功,但是事务A并没有提交,钱并没有扣成功,导致错误的发生。
2. 不可重复读
对于数据库中的一个数据,在一个事务内对该数据进行了多次重复查询,发现查询结果不一致。原因在于在该事务查询过程中,另一个事务修改了该数据并提交。
不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
3. 幻读
例如当事务A删除了所有的X类数据,此时事务B又向数据库插入一些X类数据并提交。操作事务A的用户发现自己好像并没有全部都删除,就如同产生了幻觉一样。
4. 隔离级别
事务隔离级别(√代表会出现该问题)- MySQL支持这四种隔离级别,默认为REPEATABLE READ
- Oracle只支持READ COMMITTED 和 SERIALIZABLE,默认为READ COMMITTED