Oracle 数据库事务隔离级别

查看原文:http://www.ibloger.net/article/239.html

事务隔离级别:一个事务对数据库的修改与并行的另一个事务的隔离程度。
两个并发事务同时访问数据库表相同的行时,可能存在以下三个问题:

  1. 幻想读:事务t1读取一条指定where条件的语句,返回结果集。此时事务t2插入一行新记录,恰好满足t1的where条件。然后t1使用相同的条件再次查询,结果集中可以看到t2插入的记录,这条新纪录就是幻想。
  2. 不可重复读取:事务t1读取一行记录,紧接着事务t2修改了t1刚刚读取的记录,然后t1再次查询,发现与第一次读取的记录不同,这称为不可重复读。
  3. 脏读:事务t1更新了一行记录,还未提交所做的修改,这个t2读取了更新后的数据,然后t1执行回滚操作,取消刚才的修改,所以t2所读取的行就无效,也就是脏数据。

数据库事务的隔离级别有4个,由低到高依次为Read uncommittedRead committedRepeatable readSerializable,这四个级别可以逐个解决脏读不可重复读幻读这几类问题

√: 可能出现    ×: 不会出现

 脏读不可重复读幻读
Read uncommitted
Read committed×
Repeatable read××
Serializable×××

Oracle数据库支持read committed serializable这两种事务隔离级别。所以oracle不支持脏读

sql标准所定义的默认事务隔离级别是 serializable,但是oracle 默认使用的是 read committed

设置隔离级别使用 set transaction isolation level [ read uncommitted | read committed | repeatable read | serializable]

下面是oracle 设置serializable隔离级别一个示例:
-- 设置Oracle事务的隔离级别(默认为read committed)
set transaction isolation level read committed; 

左面是事务T1,右面是事务T2,因为T2级别为SERIALIZABLE,所以即使事务T1在提交了数据之后,事务T2还是看不到T1提交的数据,幻想读和不可重复读都不允许了。
那如何能查看到T1新增的记录呢? 上面T1和T2是并发执行,在T1执行insert的时候事务T2已经开始了,因为T2级别是SERIALIZABLE,所以T2所查询的数据集是T2事务开始前数据库的数据。即事务T1在事务T2开始之后的insert和update操作的影响都不会影响事务T2。现在重新开启一个事务T3 就可以看到T1新增的记录了。
当下列事件发生时,事务就开始了:
1、连接到数据库,并执行第一条DML语句
2、前一个事务结束后,又输入了另一条DML语句



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值