oracle模拟重叠事务,ORACLE的事务读一致性与语句读一致性

SET TRANSACTION READ ONLY来实现事物级别的一致性。一个事物所有语句读到的数据都是一致的。

我们开始试验一,模拟语句级别读一致性。第一个session使用显示打开一个游标模拟数据读,同时在游标读数据的过程中,启动另外一个session更改数据,我可以看到另外一个session对数据的更改,并不会改变到第一个session的读。这就是语句级别的读一致性。启动一个session连接数据库:Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0Connected as cboSQL> set serveroutput on;SQL>SQL> create table test(id number,name varchar2(10));Table createdSQL> insert into test values(1,'a');1 row insertedSQL> insert into test values(2,'b');1 row insertedSQL> commit;Commit completeSQL>SQL> declare2  cursor cur is select * from test;3  begin4  for rec in cur5  loop6   dbms_output.put_line(rec.name);7   dbms_lock.sleep(10);--中间等待另外一个session启动并执行更新数据操作8  end loop;9  end;10  /abPL/SQL procedure successfully completedSQL>在执行游标打印输出的时候同时启动另外一个进程,执行更新数据操作:Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0Connected as cboSQL> set serveroutput on;SQL>SQL> create table test(id number,name varchar2(10));Table createdSQL> insert into test values(1,'a');1 row insertedSQL> insert into test values(2,'b');1 row insertedSQL> commit;Commit completeSQL>SQL> declare2  cursor cur is select * from test;3  begin4  for rec in cur5  loop6   dbms_output.put_line(rec.name);7   dbms_lock.sleep(10);8  end loop;9  end;10  /abPL/SQL procedure successfully completedSQL>

下面我们开始试验二,模拟事务级别读一致性。

首先启动一个SESSION,读一次数据:

SQL> SET TRANSACTION READ ONLY;

Transaction set

SQL> select * from test;

ID NAME

---------- ----------

1 a

2 bbbb

接下来我们启动另外一个session,执行更新数据操作:

SQL> update test set name='123456';

2 rows updated

SQL> commit;

Commit complete

最后我们回到第一session查看再次查看数据:

SQL> select * from test;

ID NAME

---------- ----------

1 a

2 bbbb

我们会发现读出的数据并没有发生改变。所以在设置了SET TRANSACTION READ ONLY后,一个事务前后语句读取的数据不会因为其他seesion对数据的更新而改变。

另外SET TRANSACTION READ ONLY是有一定的条件限制的,官方文档说明如下:

TheSETTRANSACTIONstatement must be the

first statement of a new transaction; if any DML statements (including

queries) or other non-DDL statements (such asSET ROLE) precede aSET TRANSACTIONREADONLYstatement, an error is returned. Once aSETTRANSACTIONREADONLYstatement successfully executes, onlySELECTFORUPDATEclause),COMMIT,ROLLBACK, or non-DML statements (such asSETROLE,ALTERSYSTEM,LOCKTABLE) are allowed in the transaction. Otherwise, an error is returned. ACOMMIT,ROLLBACK,

or DDL statement terminates the read-only transaction; a DDL statement

causes an implicit commit of the read-only transaction and commits in

its own transaction.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值