大家都比较知道在Oracle中可以设置事务的隔离级别,其中有一个级别是read only.
read-only
遵从事务级的读一致性,仅仅能看见在本事务开始前由其它事务提交的更改。
不允许在本事务中进行DML操作。
read only是serializable的子集。它们都避免了非重复读和幻像。
区别是在read only中是只读;而在serializable中可以进行DML操作。
看到这段解释,有的朋友就遇到问题了,主要是针对“不允许在本事务中进行DML操作”的疑惑。
(备注:先在很多同志写的资料啊,BOOK啊,都写的很含糊,不尽然,所以很容易给有些朋友
带来疑惑)
比如:
SQL> conn /as sysdba
已连接。
SQL> create table toms(no int);
表已创建。
SQL> set transaction read only;
事务处理集。
SQL> insert into toms values(1);
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from toms;
NO
----------
1
其实,Oracle在相关的doc上已经做了声明
READ ONLY
This clause is not supported for the user SYS. That is, queries by SYS will return changes
made during the transaction even if SYS has set the transaction to be READ ONLY.
所以大家今后遇到这个问题也就不必再疑惑了。再次奉劝大家,有时间还是要看官方的doc,特别是刚开始学习Oracle的同志[虽然阅读e文虽有点困难,但学习的比较系统、全面,"大侠"们写的东西,我个人认为不合适初学者,因为你这个时候还没有分辨能力,而大侠的作品又不可能写的那么全面细致,他们更多的注重的是思路、方法和一些关键步骤,可以说是眼高手疏吧。哈哈]