Oracle数据库事务处理ACID中的I(隔离性)的理解

数据库 ACID性质:

A(原子性):简单来说就是执行过程有始有终,对于一个事务,要么commit,要么rollback;

C(一致性):对于数据要保持一致,比如银行的资金流入流出

I( 隔离性):要保证各个事务之间是互不影响的,并发执行的事务应该相互独立

D(持久性):对于数据的更新应该是永久的,其变化是直接写入服务器磁盘中

现在,对于隔离性,目前使用了以下两种等级:

1.REDA COMMITTED

2. SERIALIZABLE(这个其实就是最高的等级)

而对于隔离性其中的等级比较,等级越高,对于数据的安全性也就越高,但是,相反的,其并发执行处理也会越弱

隔离性的目的是为了维护数据的一致性;

对于数据的不一致,主要有以下:

1.脏数据简单的说就是A修改了B修改了的数据

对于脏数据,其实就是在事务A正在执行时,并对信息修改,同时事务B对数据进行查看,此时查看的数据时事务A修改后的数据,即产生了”脏数据“;

时间 事务A 事务B
T1 开始事务  
T2   查询账户余额(1000$)
T3   取款1000,账户余额(0)
T4 查询余额(0)  
T5 存钱(500$)  
T6   回滚事务(1000$)
T7 提交事务  
T8 查询余额(500$)  

此时的账户余额仅剩了500$,正常应该是1500$,这就是脏数据的影响;钱莫名的少了!!!

2.非重复读就是A读取了B修改了的已提交数据

时间 事务A 事务B
T1 开始事务  
T2   开始事务
T3 查询余额(1000$)  
T4   查询余额(1000$)
T5   取款1000$
T6   提交事务
T7 查询余额(0$)  

 

账户无缘无故就变成了 0 ,也是挺难受的

3.幻想读取就是A读取了B新增了的数据

时间 事务A 事务B
T1 开始事务  
T2 查询余额(1000$)  
T3   开始事务
T4   查询余额(1000$)
T5   存款1000$
T6   提交事务
T7 查询余额(2000$)  

哇,莫名的多了1000$,(别做白日梦了,全都是幻想,还是老老实实的拼搏来的实在);

所以,对于数据的一致处理,需要数据的隔离性;而在上面提到的隔离等级就很重要了。

serializable的等级最高,不会出现脏数据,非重复读和幻想读;

read committed,不会出现脏数据,但是会产生非重复读和我幻想读;

对于其等级,还有其他,因为尚未用到,所以就不往上写,等遇到后在更新。

你可能感兴趣的:(数据库)