oracle之事务隔离级别

本文小节了oracle中事务隔离级别。

ANSI SQL标准定义了4中隔离级别:
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SERIALIZABLE

隔离级别允许或不允许的3种现象
Dirty read(脏读):能读到未提交的数据。
Nonrepeatable read(不可重复读):可能会出现丢失更新。
Phantom read(幻像读): 已读的数据不会改变,和以前相比,可能会有更多满足条件的数据。

ANSI隔离级别
隔离级别                             脏读          不可重复读       幻像读
READ UNCOMMITTED        允许           允许               允许
READ COMMITTED            不允许        允许               允许
REPEATABLE READ           不允许        不允许           允许
SERIALIZABLE                 不允许        不允许           不允许

以下部分测试例子。

1、READ UNCOMMITTED
允许脏读,不可重复读和幻像读。这里想更改隔离级别,直接报错。

SQL> SET TRANSACTION  ISOLATION LEVEL  READ UNCOMMITTED;
SET TRANSACTION  ISOLATION LEVEL  READ UNCOMMITTED
                                       *
ERROR at line 1:
ORA-02179: valid options: ISOLATION LEVEL { SERIALIZABLE | READ COMMITTED }

2、READ COMMITTED
oracle的默认隔离选项。事务只能读取数据库中已经提交的数据。不允许脏读。
session 1:
SQL> conn test/test
Connected.
SQL> SET TRANSACTION 
  2  ISOLATION LEVEL 
  3  READ COMMITTED;
Transaction set.

SQL> select * from t;
         X
----------
         1

session 2:
SQL> conn test/test
Connected.
SQL> SET TRANSACTION 
  2  ISOLATION LEVEL 
  3  READ COMMITTED;

Transaction set.

SQL>  select * from t;
         X
----------
         1

session 1:
SQL> update t set x=2;

1 row updated.

SQL> insert into t values (3);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from t;
         X
----------
         2
         3

session 2:

SQL> select * from t;
         X
----------
         2
         3

==>验证了允许不可重复读和幻象读。

3、REPEATABLE READ

能给出一正确的结果,避免丢失更新。即不允许脏读和重复读,允许幻读。

4、SERIALIZABLE
最高程度的隔离性。即不允许脏读,不可重复读和幻读。

session 1;

SQL> select * from t;
        X
----------
         1

session2:

SQL> select * from t;
         X
----------
         1

SQL> SET TRANSACTION 
  2  ISOLATION LEVEL SERIALIZABLE;
Transaction set.

SQL>  select * from t;
         X
----------
         1
session1:
SQL> insert into t values (2);
1 row created.
SQL> commit;
Commit complete.

SQL> select * from t;
         X
----------
         1
         2

session 2:
SQL>  select * from t;
         X
----------
         1
SQL> update t set  x=2;
update t set  x=2
       *
ERROR at line 1:
ORA-08177: can't serialize access for this transaction

==》自事务后,session1又添加了一行为2记录,session2更改报错。

总结:
1.oracle只允许隔离级别更改为SERIALIZABLE和READ COMMITTED,默认为READ COMMITTED。
2.设置为最高级别的隔离选项(SERIALIZABLE)后,可能会在事务内遇到ORA-08177。

end;




来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25923810/viewspace-2142945/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25923810/viewspace-2142945/

<think>好的,我现在需要处理用户关于Oracle数据库事务隔离级别实现代码示例的查询。首先,用户可能想知道如何在Oracle中设置隔离级别,以及具体的代码示例。根据提供的引用内容,Oracle支持READ COMMITTED和SERIALIZABLE两种隔离级别,默认是READ COMMITTED。用户提到的实现代码可能指的是如何通过SQL语句来设置这些隔离级别,而不是底层代码。 接下来,我需要确认用户是否混淆了隔离级别的设置与底层实现。引用中提到Oracle依赖undo段来实现隔离级别,这可能涉及回滚段的管理,但这部分代码是Oracle内部的,用户通常无法直接访问。因此,正确的做法是提供如何通过ALTER SESSION语句修改隔离级别的示例。 然后,用户可能需要了解不同隔离级别的行为差异。例如,在SERIALIZABLE级别下,事务会看到一致的数据快照,而READ COMMITTED允许读取已提交的更改。需要确保示例代码正确展示如何设置这两种级别,并解释其影响。 另外,用户可能对事务中的锁机制或并发控制感兴趣,但根据引用,Oracle的读取不会阻塞写入,反之亦然,这与undo段的使用有关。需要指出这一点,并说明隔离级别设置后的效果,如可能出现的ORA-01555错误。 最后,生成相关问题时要覆盖隔离级别的作用、差异、应用场景和常见错误,帮助用户深入理解。确保回答结构清晰,步骤明确,引用正确来源。</think>### Oracle事务隔离级别实现与示例 Oracle数据库支持两种事务隔离级别:$READ\ COMMITTED$(默认)和$SERIALIZABLE$。其实现依赖于**UNDO段(回滚段)**机制,通过保存数据修改前的副本来实现多版本并发控制(MVCC)[^1][^2]。 #### 1. 设置隔离级别的代码示例 ```sql -- 设置会话为READ COMMITTED(默认) ALTER SESSION SET ISOLATION_LEVEL = READ COMMITTED; -- 设置会话为SERIALIZABLE ALTER SESSION SET ISOLATION_LEVEL = SERIALIZABLE; ``` #### 2. 隔离级别行为对比 | 隔离级别 | 脏读 | 不可重复读 | 幻读 | 实现依赖 | 快照一致性 | |------------------|------|------------|------|------------------|------------------| | READ COMMITTED | ❌ | ✔️ | ✔️ | 语句级UNDO | 仅当前语句 | | SERIALIZABLE | ❌ | ❌ | ❌ | 事务级UNDO | 整个事务一致性 | #### 3. 操作示例 ```sql -- 会话1(SERIALIZABLE) ALTER SESSION SET ISOLATION_LEVEL = SERIALIZABLE; BEGIN SELECT salary FROM employees WHERE id = 100; -- 返回原始值 -- 其他会话修改数据在此处不可见 COMMIT; END; ``` #### 4. 底层实现关键点 - **UNDO段存储**:数据修改前的副本保存在UNDO段中,提供一致性读取[^1] - **无锁读取**:查询操作不需要加锁,直接访问UNDO数据[^4] - **ORA-01555风险**:长时间事务可能因UNDO空间覆盖导致错误[^2] $$ Consistency\ Model: \quad \forall T_i \in \mathcal{T},\ \exists \text{UNDO}_i \rightarrow ReadSet(T_i) \cap WriteSet(T_j) = \emptyset \quad (j > i) $$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值