数据库的隔离级别及实现原理

一、数据库的隔离级别

数据库的隔离级别                                                     脏读                       不可重复读                  幻读

读取未提交(Read Uncommittied)                         √                             √                                 

读取已提交(Read  committed)                              ×                             √                                √  

可重复读(Repeated  Read)                                    ×                              ×                               

序列化(serializable)                                                ×                              ×                               ×


幻读:事务T1读取一条指定的where条件语句返回结果集,此时事务T2插入一条新记录,恰好满足T1的where条件,然后T1使用相同的条件再次查询,结果集中可以看到T2插入的记录,这条新记录就是幻想。

不可重复读:事务T1读取一条记录,紧接着事务T2修改了刚才读取的记录,T1再次查询时发现与第一次读取的 不同没这称为不可重复读。

脏读:事务T1更新了一条记录,还未提交刚才所做的修改,T2读取了这个记录,然后T1执行回滚操作,取消刚才的操作,所以T2读取的就无效,也就是脏数据。

Oracle支持 Read Committed和serializable,默认Read committed

设置隔离级别 : set transaction isolation level [Read uncommitted | Read committed | Repeated  Read | serializable]


二、实现原理:

1、Read uncommitted:事务对当前读的数据不加锁;事务在更新数据的瞬间(就是发生更新的瞬间),必须先对其加行级共

       享锁,直到事务结束释放。

  表现:事务1读取记录时,事务2可以对这条记录读取,更新;当事务2对该记录更新时,事务1再次读取该记录,能读到事务2 对这条记录修改的版本,即使事务2未提交;

事务1更新某一行记录时,事务2不能对这条记录做更新,直到事务1结束。

2、Read committed :事务对当前被读取的数据加行级共享锁(当读到时才加锁),一旦读完该行立即释放该行级共享锁;事务在更新某数据的瞬间(发生更新的瞬间),必须先对其加行级排它锁,直到事务结束才释放。

表现:事务1读取某行数据时,事务2也能对这条记录进行读取,更新;当事务2对该记录更新时,事务1再次读取该记录,读取到的只能是对其更新前的版本;事务1更新某行记录时,事务2不能对这行记录更新,直到事务1结束。

3、Repeated  Read :事务在读取某数据的瞬间(开始读取的瞬间),必须先对其加行级共享锁,直到事务结束时才释放;事务在更新数据的瞬间(就是发生更新的瞬间),必须先对其加行级排他锁,直到事务结束释放。

表现:事务1读取某行记录时,事务2也能对这条记录进行读取,更新;事务2对该记录进行更新时,事务1再次读取,读取到的仍然是第一次读取的那个版本;事务1更新某行记录时,事务2不能对这行记录做更新,直到事务1结束。

4、serializable:事务在读取数据时,必须先对其加表级共享锁,直到事务结束才释放;事务在更新数据时,必须先对其先加表级排它锁,直到事务结束才释放。

表现:事务1正在读取A表中的记录,则事务2也能读取A表,但不能对A表新增,更新,删除,直到事务结束;事务1正在更新A表的记录,事务2不能读取A表的任意记录,更不能对A表新增,更新,删除,直到事务1结束。

猜你喜欢

转载自blog.csdn.net/zhangyunsheng11/article/details/79232229