现在的位置: 首页 > 综合 > 正文

笔记081113 ROWNUM UPDATE DCL 事务 锁定 ROLLBACK SEQUENCE ROWID DBMS_RANDOM.RANDOWM 隔离级别

2017年12月19日 ⁄ 综合 ⁄ 共 21787字 ⁄ 字号 评论关闭

笔记081113


2008-11-15 上午2:14 发布人 tiger chang

************************************
NAME    :CHANGTIGER
DATE    :13:37 2008-11-13
EMAIL    :o52tiger@yahoo.com.cn
************************************

################################   /     ##############################################

SQL>  SELECT * FROM TIGER3;

A          B          C
---------- ---------- ----------
AAA        AAA        AAA

SQL> /

A          B          C
---------- ---------- ----------
AAA        AAA        AAA

SQL>

/ 表示执行上一条命令

##############################   ROWNUM != 4  #########################################
查询出4以前的数据
当ROWNUM=1时 满足条件 输出
当ROWNUM=2时 满足条件 输出
当ROWNUM=4时 不满足条件 此时ROWNUM = 3 故不输出
当ROWNUM=5时 不满足条件 此时ROWNUM = 3 故还是不输出

SQL> SELECT ROWNUM, S.* FROM STUDENT2 S WHERE ROWNUM != 4;

    ROWNUM         ID SNAME                       CID        AGE
---------- ---------- -------------------- ---------- ----------
         1       1001 CHANGTIGER                    1         24
         2       1003 SHANGHAI                      2         24
         3       1004 BEIJING                       2         24

################################   用子查询建表 #######################################
用子查询建表

也可以是多表链接查询
这里只是把非空约束和数据被复制到新表中,其他的主键约束 ,外键约束等都没有被创建。

CREATE TABLE STUDENT4 AS  SELECT ID SID ,SNAME, AGE FROM STUDENT2 ;

SQL> CREATE TABLE STUDENT4 AS  SELECT ID SID ,SNAME, AGE FROM STUDENT2 ;

Table created.

SQL> DESC STUDENT4;
 Name                                      Null?    Type
 ----------------------------------------- -------- ------------------------
 SID                                                NUMBER(8)
 SNAME                                              VARCHAR2(20)
 AGE                                                NUMBER(3)

SQL> SELECT * FROM STUDENT4;

       SID SNAME                       AGE
---------- -------------------- ----------
      1001 CHANGTIGER                   24
      1003 SHANGHAI                     24
      1004 BEIJING                      24
      1002 NANCHANG                     24

SQL>

############################ DML INSERT  #####################################

INSERT INTO STUDENT2 VALUES(12,'STUDENTNAME',2,24);

用子查询语句插入数据

INSERT INTO STUDENT2(ID,SNAME,CID, AGE) SELECT SID ,SNAME , CID ,AGE FROM SELECT4 ;

################################  DML UPDATE  #######################################

修改一个数据
UPDATE STUDENT2
SET SNAME = 'HELLOWORLD'
WHERE ID = 1001 ;

修改两个数据
UPDATE STUDENT2
SET SNAME = 'HELLOWORLD' , AGE = 33
WHERE ID = 1001 ;

UPDATE STUDENT2
SET AGE = AGE + 10

将所有人的年龄都加十;
SQL> UPDATE STUDENT2 SET AGE = AGE + 10;

4 rows updated.

SQL> SELECT * FROM STUDENT2;

        ID SNAME                       CID        AGE
---------- -------------------- ---------- ----------
      1001 CHANGTIGER                    1         34
      1003 SHANGHAI                      2         34
      1004 BEIJING                       2         34
      1002 NANCHANG                      1         34

SQL>

创建一个测试表
SQL> CREATE TABLE TIGER13 (
  2  A NUMBER(3),
  3  B NUMBER(3)
  4  );

Table created.
插入两条数据
SQL> INSERT INTO TIGER13 VALUES(2,3);

1 row created.

SQL> INSERT INTO TIGER13 VALUES(3,4);

1 row created.

SQL> COMMIT
  2  ;

Commit complete.

更新表中两条数据
查询了两次,效率比较低
SQL> UPDATE TIGER13 SET A = (SELECT MAX(ID) FROM STUDENT2) , B = (SELECT AVG(AGE
) FROM STUDENT2);

2 rows updated.

SQL> SELECT * FROM TIGER13;

         A          B
---------- ----------
      1004         34
      1004         34

SQL>

查询一次做两项更新,效率是非常高的。
SQL> UPDATE TIGER13 SET (A,B) = ( SELECT MAX(ID) , AVG(AGE) FROM STUDENT2 );

2 rows updated.

SQL> SELECT * FROM TIGER13;

         A          B
---------- ----------
      1004         34
      1004         34

SQL>

############################### DML DELETE  #########################################

删除多有数据
SQL> DELETE FROM TIGER13 ;

2 rows deleted.

SQL> SELECT * FROM TIGER13;

no rows selected

删除指定的值
SQL> DELETE FROM TIGER2 WHERE ID = 4;

1 row deleted.

############################### DCL 事务 #########################################

事务能够保证事务的一组相关的操作一起成功或一起失败。

事务的四个特性:ACID
1     原子性 ATOMIC         保证一组相关的操作一起成功或一起失败,不可分割
2    一致性 CONSISTENCE   
3    隔离性 ISOLATION    两个事务间要隔离性
4    持久性 DURABILITY    持久性如果成功持久化到表文件里

分两种:
局部事务 数据库的操作都是针对一个数据库的同一个用户

全局事务(分布式事务)
(数据库操作针对多个数据库或者一个数据库的不同用户下的表)

事务的语法:

在SQLPLUS中当执行第一个语句后就会自动的开始一个事务。

事务的结束:可以用以下两个命令:
        COMMIT 和 ROLLBACK
当使用数据定义语言DDL 后事务会自动的提交。
当推出SQLPLUS后也会自动的提交, 或是ERRORS, SYSTEM CRASH

DCL 语言中的授权GRANT 也会自动提交

COMMIT

ROLLBACK     把整个事务的操作都回滚。

SQL> SELECT * FROM TIGER2;

        ID NAME                        AGE
---------- -------------------- ----------
ADDR                                               BIRTH
-------------------------------------------------- ---------
         1 CHANGHU                      22
NANCHANG HANGKONG DAXUE                            09-NOV-08

         2 CHANGTIGER                   22
BEIJING                                            09-NOV-08

         3 WANGLIHONG                   23
TAIPEI                                             09-NOV-08

SQL> DESC TIGER2;
 Name                                      Null?    Type
 ----------------------------------------- -------- ---------------------
 ID                                                 NUMBER(4)
 NAME                                               VARCHAR2(20)
 AGE                                                NUMBER(3)
 ADDR                                               VARCHAR2(50)
 BIRTH                                              DATE

SQL> INSERT INTO TIGER2 VALUES(1008,'GOOGLE',33,'NEWYORK',SYSDATE);

1 row created.

SQL>  SELECT * FROM TIGER2;

        ID NAME                        AGE
---------- -------------------- ----------
ADDR                                               BIRTH
-------------------------------------------------- ---------
         1 CHANGHU                      22
NANCHANG HANGKONG DAXUE                            09-NOV-08

         2 CHANGTIGER                   22
BEIJING                                            09-NOV-08

         3 WANGLIHONG                   23
TAIPEI                                             09-NOV-08

        ID NAME                        AGE
---------- -------------------- ----------
ADDR                                               BIRTH
-------------------------------------------------- ---------
      1008 GOOGLE                       33
NEWYORK                                            13-NOV-08

SQL> DELETE FROM TIGER2;

4 rows deleted.

SQL> ROLLBACK ;

Rollback complete.

SQL> SELECT * FROM TIGER2;

        ID NAME                        AGE
---------- -------------------- ----------
ADDR                                               BIRTH
-------------------------------------------------- ---------
         1 CHANGHU                      22
NANCHANG HANGKONG DAXUE                            09-NOV-08

         2 CHANGTIGER                   22
BEIJING                                            09-NOV-08

         3 WANGLIHONG                   23
TAIPEI                                             09-NOV-08

SQL>

锁定:
———————————————  锁定  ———————————————————
在一个事务中修改数据没有提交
SQL> UPDATE TIGER2 SET NAME = 'BEIJING' WHERE ID = 3;

1 row updated.

SQL>
再另外一个事务中修改数据 则不能继续下去
SQL>    UPDATE TIGER2 SET NAME = 'NANJING' WHERE ID = 3;

.....................................

当第一个事务提交或回滚后
SQL> COMMIT
  2  ;

Commit complete.

SQL>
第二个事务则可以执行下去了
SQL>    UPDATE TIGER2 SET NAME = 'NANJING' WHERE ID = 3;

1 row updated.
——————————————回滚点的设置———————————————————

查看原本的数据
SQL>  SELECT * FROM TIGER2;

        ID NAME                        AGE
---------- -------------------- ----------
ADDR                                               BIRTH
-------------------------------------------------- ---------
         1 CHANGHU                      22
NANCHANG HANGKONG DAXUE                            09-NOV-08

         2 CHANGTIGER                   22
BEIJING                                            09-NOV-08

         3 NANJING                      23
TAIPEI                                             09-NOV-08

插入一条数据
SQL> INSERT INTO TIGER2 VALUES(4,'HEWEI',22,'ADDR',SYSDATE);

1 row created.

确定一个回滚点
SQL> SAVEPOINT INSERT_DONE;

Savepoint created.

删除插入的数据
SQL> DELETE FROM TIGER2 WHERE ID = 4;

1 row deleted.

回滚到插入数据点
SQL> ROLLBACK TO INSERT_DONE;

Rollback complete.

查看数据
SQL> SELECT * FROM TIGER2;

        ID NAME                        AGE
---------- -------------------- ----------
ADDR                                               BIRTH
-------------------------------------------------- ---------
         1 CHANGHU                      22
NANCHANG HANGKONG DAXUE                            09-NOV-08

         2 CHANGTIGER                   22
BEIJING                                            09-NOV-08

         3 NANJING                      23
TAIPEI                                             09-NOV-08

        ID NAME                        AGE
---------- -------------------- ----------
ADDR                                               BIRTH
-------------------------------------------------- ---------
         4 HEWEI                        22
ADDR                                               13-NOV-08

SQL>

################################  SEQUENCE 序列  ########################################
序列自动的生成一个唯一的数据,常用于主键,

CREATE SEQUENCE SEQ_TIGER; (DDL 数据定义语言)

SQL> CREATE SEQUENCE SEQ_TIGER; 序列名自己定义

Sequence created.

SQL>

序列的最简单的用法 默认递增为1;这个序列并不是专用于某个表的,在对另外的表的操作也可以使用这个序列。

SQL> INSERT INTO TIGER2 VALUES(SEQ_TIGER.NEXTVAL,'CHANGHU',22,'NANCHANG ',SYSDAT
E);

1 row created.

SQL> SELECT * FROM TIGER2;
.......................
.......................

修改序列
ALTER SEQUENCE SEQ_TIGER INCREMENT BY 2 ;
如果要修改序列的START WITH 的话就得将序列的删掉 重新建立

删除序列

SQL> DROP SEQUENCE SEQ_TIGER;

Sequence dropped.

新建一个序列
SQL> CREATE SEQUENCE SEQ_TIGER INCREMENT BY 2 START WITH 100;

Sequence created.

插入数据用序列

SQL> INSERT INTO TIGER2 VALUES(SEQ_TIGER.NEXTVAL,'CHANGHU',22,'NANCHANG ',SYSDAT
E );

1 row created.
插入数据
SQL> INSERT INTO TIGER2 VALUES(SEQ_TIGER.NEXTVAL,'CHANGHU',22,'NANCHANG ',SYSDAT
E);

1 row created.
查看数据
SQL> SELECT * FROM TIGER2;

        ID NAME                        AGE
---------- -------------------- ----------
ADDR                                               BIRTH
-------------------------------------------------- ---------
       102 CHANGHU                      22
NANCHANG                                           13-NOV-08

       100 CHANGHU                      22
NANCHANG                                           13-NOV-08
SQL>

创建序列

CREATE  SEQUENCE SEQ_TIGER2
INCREMENT BY 1      --------递增值
START WITH 100      --------开始值
MAXVALUE 99999999   --------最大值
NOCACHE
NOCYCLE;

Specify
how many values of the sequence the database preallocates and keeps in
memory for faster access. This integer value can have 28 or fewer
digits. The minimum value for this parameter is 2

________________________________序列的数据字典_______________________________________
SQL> DESC USER_SEQUENCES;
 Name                                      Null?    Type
 ----------------------------------------- -------- ---------------------
 SEQUENCE_NAME                             NOT NULL VARCHAR2(30)
 MIN_VALUE                                          NUMBER
 MAX_VALUE                                          NUMBER
 INCREMENT_BY                              NOT NULL NUMBER
 CYCLE_FLAG                                         VARCHAR2(1)
 ORDER_FLAG                                         VARCHAR2(1)
 CACHE_SIZE                                NOT NULL NUMBER
 LAST_NUMBER                               NOT NULL NUMBER

SQL> SELECT SEQUENCE_NAME , MIN_VALUE , MAX_VALUE FROM USER_SEQUENCES;

SEQUENCE_NAME                   MIN_VALUE  MAX_VALUE
------------------------------ ---------- ----------
SEQ_TIGER                               1 1.0000E+27

NEXTVAL 序列的下一个可用的值
CURRVAL 序列当前的值

将当前的SEQUENCE 的值在此插入 到表中。
SQL>  INSERT INTO TIGER2 VALUES(SEQ_TIGER.CURRVAL , 'CHANGHU',22,'NANCHANG ',SYS
DATE);

1 row created.

SQL> SELECT * FROM TIGER2;

        ID NAME                        AGE
---------- -------------------- ----------
ADDR                                               BIRTH
-------------------------------------------------- ---------
       102 CHANGHU                      22
NANCHANG                                           13-NOV-08

       102 CHANGHU                      22
NANCHANG                                           13-NOV-08

       100 CHANGHU                      22
NANCHANG                                           13-NOV-08

*************************************************************查找关于SYS.DUAL 的用法

SQL> SELECT SEQ_TIGER.CURRVAL FROM SYS.DUAL;

   CURRVAL
----------
       102

################################  ROWID  ########################################
查看表的ROWID

SQL> SELECT ROWID FROM STUDENT3;

ROWID
------------------
AAAHkyAABAAAN1qAAA
AAAHkyAABAAAN1qAAB
AAAHkyAABAAAN1qAAC
AAAHkyAABAAAN1qAAD

根据ROWID来查询会有更高的效率

SQL> SELECT * FROM STUDENT3 WHERE ROWID = 'AAAHkyAABAAAN1qAAB';

       SID SNAME             CID
---------- ---------- ----------
         2 TIGER2            101


################################    ########################################
删除一张表中的重复数据,只留下一个。

SQL> SELECT * FROM STUDENT3;

       SID SNAME             CID
---------- ---------- ----------
         5 TIGER             103
         2 TIGER2            101
         6 TIGER             104
         1 TIGER

SQL>  DELETE FROM STUDENT3 A WHERE SID >
  2  ( SELECT MIN(SID) FROM STUDENT3 B
  3   WHERE A.SNAME = B.SNAME );

2 rows deleted.

删除了名字为tiger的另外两条数据;
SQL> SELECT * FROM STUDENT3;

       SID SNAME             CID
---------- ---------- ----------
         2 TIGER2            101
         1 TIGER

SQL>

用ROWID来做查询可以的到更高的效率

DELETE FROM STUDENT3 A WHERE A.ROWID >
(SELECT MIN(S.ROWID) FROM STUDENT3 S
WHERE A.SNAME = S.SNAME AND  A.ROWID != S.ROWID );

SQL>  DELETE FROM STUDENT3 A WHERE A.ROWID >
  2  ( SELECT MIN(S.ROWID) FROM STUDENT3 S
  3  WHERE A.SNAME = S.SNAME AND  A.ROWID != S.ROWID );

2 rows deleted.

SQL> SELECT * FROM STUDENT3;

       SID SNAME             CID
---------- ---------- ----------
         2 TIGER2            101
         1 TIGER

##########################  DBMS_RANDOM.RANDOWM  ############################
生成随机数

SQL> SELECT DBMS_RANDOM.RANDOM FROM STUDENT3;

    RANDOM
----------
  70438005
1076882324
-2.033E+09
-1.276E+09

SQL>

随机取出表中的n条数据

SQL> SELECT * FROM
  2   ( SELECT * FROM STUDENT3 ORDER BY DBMS_RANDOM.RANDOM)
  3  WHERE ROWNUM < 2;

       SID SNAME             CID
---------- ---------- ----------
         2 TIGER2            101

SQL>

例子二

SQL> select * from student2;

        ID SNAME                       CID        AGE
---------- -------------------- ---------- ----------
      1001 CHANGTIGER                    1         34
      1003 SHANGHAI                      2         34
      1004 BEIJING                       2         34
      1002 NANCHANG                      1         34

SQL>  SELECT * FROM
  2   ( SELECT * FROM STUDENT2  ORDER BY DBMS_RANDOM.RANDOM)
  3   WHERE ROWNUM < 3;

        ID SNAME                       CID        AGE
---------- -------------------- ---------- ----------
      1003 SHANGHAI                      2         34
      1001 CHANGTIGER                    1         34

SQL>

################################  隔离级别  ########################################

四种读的情况:
脏读,     dirty - read          一个事物能够读到另外一个事物没有提交的数据(oracle 不支持)
提交读  committed-read ,    提交了的数据才能被另外一个事物读到  (oracle 默认)
重复读    repeatable-read    
                一个事物查询到数据的时候
                另外一个事物更新了该数据 然后提交了数据
                此时第一个事物有查询了数据,此时该数据已经被更新   
                有时要第一个事物还是看到原数据
                这就需要重复读
幻影读    serializable-read / phantom-read  
                一个事物查询到数据的时候
                另外一个事物插入了新的数据 然后提交了数据
                此时第一个事物有查询了数据,此时可以查询到新数据了   
                有时要第一个事物还是要不看到新数据
                这就需要幻影读   

################################  隔离级别  ########################################
第一个事物查看数据
SQL> SELECT * FROM STUDENT2;

        ID SNAME                       CID        AGE
---------- -------------------- ---------- ----------
      1001 CHANGTIGER                    1         34
      1003 SHANGHAI                      2         34
      1004 BEIJING                       2         34
      1002 NANCHANG                      1         34

SQL>

第二个事物更新该表

SQL> UPDATE STUDENT2 SET SNAME = 'SHENZHENG' WHERE ID = 1001;

1 row updated.

SQL>

第一个事物设置为幻影读

SQL> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

Transaction set.

第二个事物提交更新
SQL> COMMIT
  2  ;

Commit complete.
第二个事物查询

SQL> SELECT * FROM STUDENT2;

        ID SNAME                       CID        AGE
---------- -------------------- ---------- ----------
      1001 SHENZHENG                     1         34
      1003 SHANGHAI                      2         34
      1004 BEIJING                       2         34
      1002 NANCHANG                      1         34

第一个事物查询
SQL>  SELECT * FROM STUDENT2;

        ID SNAME                       CID        AGE
---------- -------------------- ---------- ----------
      1001 CHANGTIGER                    1         34
      1003 SHANGHAI                      2         34
      1004 BEIJING                       2         34
      1002 NANCHANG                      1         34

***************************************************************************

SET TRANSACTION
   { { READ { ONLY | WRITE }
     | ISOLATION LEVEL
       { SERIALIZABLE | READ COMMITTED }
     | USE ROLLBACK SEGMENT rollback_segment
     }
     [ NAME 'text' ]
   | NAME 'text'
   } ;

设置 提交读 COMMIT
SQL> SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

Transaction set.

SQL>

ORACLE 只支持两种  SERIALIZABLE | READ COMMITTED
SQL> SET TRANSACTION ISOLATION LEVEL REPEATABLE;
SET TRANSACTION ISOLATION LEVEL REPEATABLE
                                *
ERROR at line 1:
ORA-02179: valid options: ISOLATION LEVEL { SERIALIZABLE | READ COMMITTED }

设置时必须是一个事物的开始时就设置。
SET TRANSACTION must be first statement of transaction

#######################      转帖的资料      #####################

ORACLE的隔离级别

作者: Parrotao

 

 

隔离级别(isolation
level

 

l        
隔离级别定义了事务与事务之间的隔离程度。

l        
隔离级别与并发性是互为矛盾的:隔离程度越高,数据库的并发性越差;隔离程度越低,数据库的并发性越好。

l        
ANSI/ISO SQL92标准定义了一些数据库操作的隔离级别:

l         
未提交读(read
uncommitted

l         
提交读(read committed

l         
重复读(repeatable read

l         
序列化(serializable

l        
通过一些现象,可以反映出隔离级别的效果。这些现象有:

l         
更新丢失(lost update):当系统允许两个事务同时更新同一数据是,发生更新丢失。

l         
脏读(dirty read):当一个事务读取另一个事务尚未提交的修改时,产生脏读。

l         
非重复读(nonrepeatable
read
):同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。(A transaction rereads data it has previously read and finds that
another committed transaction has modified or deleted the data.  )

l         
幻像(phantom read):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。(A transaction reexecutes a query returning a set of rows that
satisfies a search condition and finds that another committed transaction has inserted
additional rows that satisfy the condition.  )

l        
下面是隔离级别及其对应的可能出现或不可能出现的现象

 

Dirty Read 

NonRepeatable
Read 

Phantom Read 

Read uncommitted

Possible

Possible

Possible

Read committed

Not possible

Possible

Possible

Repeatable read

Not possible

Not possible

Possible

Serializable

Not possible

Not possible

Not possible

 

 

ORACLE的隔离级别

 

l        
ORACLE提供了SQL92标准中的read
committed
serializable,同时提供了非SQL92标准的read-only

l         
read committed

l        
这是ORACLE缺省的事务隔离级别。

l        
事务中的每一条语句都遵从语句级的读一致性。

l        
保证不会脏读;但可能出现非重复读和幻像。

l         
serializable

l        
简单地说,serializable就是使事务看起来象是一个接着一个地顺序地执行。

l        
仅仅能看见在本事务开始前由其它事务提交的更改和在本事务中所做的更改。

l        
保证不会出现非重复读和幻像。

l        
Serializable隔离级别提供了read-only事务所提供的读一致性(事务级的读一致性),同时又允许DML操作。

l        
如果有在serializable事务开始时未提交的事务在serializable事务结束之前修改了serializable事务将要修改的行并进行了提交,则serializable事务不会读到这些变更,因此发生无法序列化访问的错误。(换一种解释方法:只要在serializable事务开始到结束之间有其他事务对serializable事务要修改的东西进行了修改并提交了修改,则发生无法序列化访问的错误。)

l        
If a serializable
transaction contains data manipulation language (DML) that attempts to update
any resource that may have been updated in a transaction uncommitted at the
start of the serializable transaction,
(并且修改在后来被提交而没有回滚),then the DML statement fails. 返回的错误是ORA-08177:
Cannot serialize access for this transaction

l        
ORACLE在数据块中记录最近对数据行执行修改操作的N个事务的信息,目的是确定是否有在本事务开始时未提交的事务修改了本事务将要修改的行。具体见英文:Oracle permits a serializable transaction to modify a data row only
if it can determine that prior changes to the row were made by transactions
that had committed when the serializable transaction began. To make this
determination efficiently, Oracle uses control information stored in the data
block that indicates which rows in the block contain committed and uncommitted
changes. In a sense, the block contains a recent history of transactions that
affected each row in the block. The amount of history that is retained is
controlled by the INITRANS parameter of CREATE TABLE and ALTER TABLE. Under
some circumstances, Oracle may have insufficient history information to
determine whether a row has been updated by a "too recent"
transaction. This can occur when many transactions concurrently modify the same
data block, or do so in a very short period. You can avoid this situation by
setting higher values of INITRANS for tables that will experience many
transactions updating the same blocks. Doing so will enable Oracle to allocate
sufficient storage in each block to record the history of recent transactions
that accessed the block.

l         
The INITRANS ParameterOracle stores control information in
each data block to manage access by concurrent transactions. Therefore, if you
set the transaction isolation level to serializable, you must use the ALTER
TABLE command to set INITRANS to at least 3. This parameter will cause Oracle
to allocate sufficient storage in each block to record the history of recent
transactions that accessed the block. Higher values should be used for tables
that will undergo many transactions updating the same blocks.

l         
read-only

l        
遵从事务级的读一致性,仅仅能看见在本事务开始前由其它事务提交的更改。

l        
不允许在本事务中进行DML操作。

l        
read onlyserializable的子集。它们都避免了非重复读和幻像。区别是在read only中是只读;而在serializable中可以进行DML操作。

l        
Export with CONSISTENT =
Y sets the transaction to read-only.

l         
read committedserializable的区别和联系:

l        
事务1先于事务2开始,并保持未提交状态。事务2想要修改正被事务1修改的行。事务2等待。如果事务1回滚,则事务2(不论是read committed还是serializable方式)进行它想要做的修改。如果事务1提交,则当事务2read committed方式时,进行它想要做的修改;当事务2serializable方式时,失败并报错“Cannot serialize access”,因为事务2看不见事务1提交的修改,且事务2想在事务一修改的基础上再做修改。具体见英文:Both read committed and serializable transactions use row-level
locking, and both will wait if they try to change a row updated by an
uncommitted concurrent transaction. The second transaction that tries to update
a given row waits for the other transaction to commit or roll back and release
its lock. If that other transaction rolls back, the waiting transaction
(regardless of its isolation mode) can proceed to change the previously locked
row, as if the other transaction had not existed. However, if the other
(blocking) transaction commits and releases its locks, a read committed
transaction proceeds with its intended update. A serializable transaction,
however, fails with the error "Cannot serialize access", because the
other transaction has committed a change that was made since the serializable
transaction began.

l        
read committedserializable可以在ORACLE并行服务器中使用。

l         
关于SET TRANSACTION
READ WRITE
read writeread
committed
应该是一样的。在读方面,它们都避免了脏读,但都无法实现重复读。虽然没有文档说明read
write
在写方面与read committed一致,但显然它在写的时候会加排他锁以避免更新丢失。在加锁的过程中,如果遇到待锁定资源无法锁定,应该是等待而不是放弃。这与read committed一致。

l        
语句级的读一致性

l         
ORACLE保证语句级的读一致性,即一个语句所处理的数据集是在单一时间点上的数据集,这个时间点是这个语句开始的时间。

l         
一个语句看不见在它开始执行后提交的修改。

l         
对于DML语句,它看不见由自己所做的修改,即DML语句看见的是它本身开始执行以前存在的数据。

l        
事务级的读一致性

l         
事务级的读一致性保证了可重复读,并保证不会出现幻像。

l        
设置隔离级别

l         
设置一个事务的隔离级别

l        
SET TRANSACTION ISOLATION
LEVEL READ COMMITTED;

l        
SET TRANSACTION ISOLATION
LEVEL SERIALIZABLE;

l        
SET TRANSACTION READ
ONLY;

l        
设置增个会话的隔离级别

l        
ALTER SESSION SET
ISOLATION_LEVEL SERIALIZABLE;

l        
ALTER SESSION SET
ISOLATION_LEVEL READ COMMITTED;

 

==================================

作者联系方式:

E     TaoPuyin
G  System
Engineer Oracle DBA

Fuji
Xerox China Limited (Shanghai)

抱歉!评论已关闭.