青儿的足迹 发表于 2015-4-23 09:06
A B C 正确 D E 错误
解析:
实验过程如下: 环境 10.1.0.2.0 + win Xp
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
C:\Documents and Settings\20130731>sqlplus / as sysdba
SQL*Plus: Release 10.1.0.2.0 - Production on 星期四 4月 23 09:12:26 2015
Copyright (c) 1982, 2004, Oracle. All rights reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> /**
SQL> (A)
SQL> 在一个只读事务中,SELECT INTO, OPEN, FETCH, CLOSE, COMMIT, 和 ROLLBACK 语
句是被允许的。
SQL> */
SQL> conn scott/tiger@orcl
已连接。
SQL> SET serveroutput ON;
SQL> SET TRANSACTION READ ONLY;
事务处理集。
SQL>
SQL> DECLARE
2 CURSOR cur_emp IS
3 SELECT * FROM emp;
4 rec_emp cur_emp%ROWTYPE;
5
6 v_ename VARCHAR2(20);
7 BEGIN
8 SELECT t.ename INTO v_ename FROM emp t WHERE t.empno = '7369';
9 dbms_output.put_line('可以 select into ' || v_ename);
10
11 OPEN cur_emp;
12 FETCH cur_emp INTO rec_emp;
13 dbms_output.put_line('可以 open 和 fetch into ' || rec_emp.ename);
14 CLOSE cur_emp;
15 dbms_output.put_line('可以 open 和 fetch into 和 close ' || rec_emp.enam
);
16 END;
17 /
可以 select into SMITH
可以 open 和 fetch into SMITH
可以 open 和 fetch into 和 close SMITH
PL/SQL 过程已成功完成。
SQL> COMMIT;
提交完成。
SQL>
SQL>
SQL> SET TRANSACTION READ ONLY;
事务处理集。
SQL> SELECT * FROM emp WHERE empno = '7369';
EMPNO ENAME JOB MGR HIREDATE SAL
---------- ---------- --------- ---------- ------------------- ----------
COMM DEPTNO
---------- ----------
7369 SMITH CLERK 7902 1980-12-17 00:00:00 800
20
SQL> ROLLBACK;
2
SQL> DROP TABLE t;
表已删除。
SQL> SET TRANSACTION READ ONLY;
事务处理集。
SQL> CREATE TABLE t(col VARCHAR2(10));
表已创建。
SQL>
SQL>
SQL> /**
SQL> (B)
SQL> 在一个只读事务中,SELECT FOR UPDATE 语句是不被允许的。
SQL> */
SQL> SET TRANSACTION READ ONLY;
事务处理集。
SQL> SELECT * FROM emp FOR UPDATE;
SELECT * FROM emp FOR UPDATE
*
第 1 行出现错误:
ORA-01456: 不能在 READ ONLY 事务处理中执行插入/删除/更新操作
SQL> ROLLBACK;
回退已完成。
SQL>
SQL> /**
SQL> (C)
SQL> 你可以在一个只读事务中执行 LOCK TABLE 语句。
SQL> */
SQL> SET TRANSACTION READ ONLY;
事务处理集。
SQL> LOCK TABLE emp IN ROW SHARE MODE NOWAIT;
表已锁定。
SQL> ROLLBACK;
回退已完成。
SQL> SET TRANSACTION READ ONLY;
事务处理集。
SQL> LOCK TABLE emp IN ROW EXCLUSIVE MODE NOWAIT;
表已锁定。
SQL> ROLLBACK;
回退已完成。
SQL> SET TRANSACTION READ ONLY;
事务处理集。
SQL> LOCK TABLE emp IN SHARE UPDATE MODE NOWAIT;
表已锁定。
SQL> ROLLBACK;
回退已完成。
SQL> SET TRANSACTION READ ONLY;
事务处理集。
SQL> LOCK TABLE emp IN SHARE MODE NOWAIT;
表已锁定。
SQL> COMMIT;
提交完成。
SQL> SET TRANSACTION READ ONLY;
事务处理集。
SQL> LOCK TABLE emp IN SHARE ROW EXCLUSIVE MODE NOWAIT;
表已锁定。
SQL> COMMIT;
提交完成。
SQL> SET TRANSACTION READ ONLY;
事务处理集。
SQL> LOCK TABLE emp IN EXCLUSIVE MODE NOWAIT;
表已锁定。
SQL> COMMIT;
提交完成。
SQL>
SQL>
SQL> /*
SQL> (D)
SQL> 如果你的会话将事务设置为READ ONLY并且在表上发起了一个查询,任何其它用户都不
能修改这张表,直至你在会话中执行了提交或者回滚。
SQL> */
SQL> -- session A
SQL> conn scott/tiger@orcl
已连接。
SQL> SET sqlp "session A >"
session A >session A >SET TRANSACTION READ ONLY;
事务处理集。
session A >SELECT T.ENAME FROM emp t WHERE t.empno = '7369';
ENAME
----------
SMITH
C:\Documents and Settings\20130731>sqlplus / as sysdba
SQL*Plus: Release 10.1.0.2.0 - Production on 星期四 4月 23 09:13:52 2015
Copyright (c) 1982, 2004, Oracle. All rights reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> -- session B
SQL> conn scott/tiger@orcl
已连接。
SQL> SET sqlp "session B >"
session B >-- session B
session B >conn scott/tiger@orcl
已连接。
session B >SET sqlp "session B >"
session B >UPDATE emp t
2 SET t.ename = '小明'
3 WHERE t.empno = '7369';
已更新 1 行。
session B >COMMIT;
提交完成。
session A >-- session A
session A >SELECT T.ENAME FROM emp t WHERE t.empno = '7369';
ENAME
----------
SMITH
session A >ROLLBACK;
回退已完成。
session A >
session A >/**
session A >(E)
session A >不管前面执行了什么样的SQL语句,SET TRANSACTION READ ONLY 语句都可以成
功被执行。
session A >*/
session A >SELECT * FROM emp WHERE empno = '7369';
EMPNO ENAME JOB MGR HIREDATE SAL
---------- ---------- --------- ---------- ------------------- ----------
COMM DEPTNO
---------- ----------
7369 小明 CLERK 7902 1980-12-17 00:00:00 800
20
session A >SET TRANSACTION READ ONLY;
事务处理集。
session A >ROLLBACK;
回退已完成。
session A >
session A >SELECT * FROM emp WHERE empno = '7369' FOR UPDATE;
EMPNO ENAME JOB MGR HIREDATE SAL
---------- ---------- --------- ---------- ------------------- ----------
COMM DEPTNO
---------- ----------
7369 小明 CLERK 7902 1980-12-17 00:00:00 800
20
session A >SET TRANSACTION READ ONLY;
SET TRANSACTION READ ONLY
*
第 1 行出现错误:
ORA-01453: SET TRANSACTION 必须是事务处理的第一个语句
session A >ROLLBACK;