oracle 自定义事务,PL/SQL Challenge 每日一题:2015-4-20用SET TRANSACTION设置事务属性

青儿的足迹 发表于 2015-4-23 09:06 forum.php?mod=viewthread&tid=1919175

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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值