一、数据库的隔离级别
数据库的隔离级别 脏读 不可重复读 幻读
读取未提交(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结束。