【Oracle OCP考试】1z0-082(3)

1.You currently have an active transaction in your session and have been granted SELECT access to VTRANSACTION(Choose three.)
Executing: SELECT xid, status FROM v$transaction; . in your session returns:
XID STATUS


0A0007000A070000 ACTIVE
In which three situations will re-executing this query still return a row but with a different XID,indicating a new transaction has started?

A . after successfully executing a DML statement following a failed DML statement DML
B . after successfully executing a CREATE TABLE statement followed by a CREATE INDEX statement.
C . after successfully executing a TRUNCATE statement followed by a DML statement.(成功执行TRUNCATE语句后,再执行DML语句)
D . after successfully executing a CREATE TABLE AS SELECT statement followed by a SELECT FOR UPDATE statement.(成功上执行CREATE TABLE AS Select 语句后再执行SELECT FOR UPDATE 语句)
E . after successfully executing a COMMIT or ROLLBACK followed by a SELECT statement.
F . after successfully executing a COMMIT or ROLLBACK followed by a DML statement.(成功执行commit或ROLLBACK之后再执行DML语句)

标准答案 :CDF

解析:

Oracle数据库事务的开启与结束

Oracle的事务开始于一个DML语句。

当以下情况发生时,事务结束:

1、COMMIT/ROLLBACK
2、执行了DDL/DCL语句
3、客户端主动断开数据库的连接(DISCONNECT)
4、数据库关闭(宕机)

另外,一个DDL/DCL语句实际上就是一个事务,其中隐含了COMMIT。
Oracle不需要特别的去指定事务的开始和结束。一个事务的结束就是下一个事务的开始。
事务是用来分割数据库活动的逻辑工作单元。事务既有起点,也有终点:当发生下列事件时,事务就开始了:

1.连接到数据库上,并执行第一条DML语句
2.前一个事务结束后,又输入另外一条DML语句

在下列事件之一发生时,事务就结束了:

1.执行Commit或者RollBack语句
2.执行一条DDL语句,例如Create Table语句;在这种情况下,会自动执行Commit语句
3.执行一条DCL语句,例如Grant语句;在这种情况下,会自动执行Commit语句
4.断开与数据库链接。在退出SQLPlus事,通常会输入EXit命令,此时会自动执行Commit语句。如果SQLPlus被意外终止(例如运行SQL*Plus的计算机崩溃)那么就会执行RollBack语句

事务完成后,如果不显式的提交或者回滚事务,都被认为是不好的编程习惯,因此确保在每个事物后面都要执行Commit或者RollBack语句。
事务中任何地方都可以设置一个保存点(savepoint),这样可以将修改回滚到保存点处。
commit

select…for update使用方法
作用:
select for update 是为了在查询时,避免其他用户以该表进行插入,修改或删除等操作,造成表的不一致性.

给你举几个例子:
select * from t for update 会等待行锁释放之后,返回查询结果。
select * from t for update nowait 不等待行锁释放,提示锁冲突,不返回结果
select * from t for update wait 5 等待5秒,若行锁仍未释放,则提示锁冲突,不返回结果
select * from t for update skip locked 查询返回查询结果,但忽略有行锁的记录

SELECT…FOR UPDATE 语句的语法如下:
  SELECT … FOR UPDATE [OF column_list][WAIT n|NOWAIT][SKIP LOCKED];
其中:
  OF 子句用于指定即将更新的列,即锁定行上的特定列。
  WAIT 子句指定等待其他用户释放锁的秒数,防止无限期的等待。
  
“使用FOR UPDATE WAIT”子句的优点如下:
  1防止无限期地等待被锁定的行;
  2允许应用程序中对锁的等待时间进行更多的控制。
  3对于交互式应用程序非常有用,因为这些用户不能等待不确定
  4 若使用了skip locked,则可以越过锁定的行,不会报告由wait n 引发的‘资源忙’异常报告

补充几点:
分成两类:加锁范围子句和加锁行为子句

加锁范围子句:在select…for update之后,可以使用of子句选择对select的特定数据表进行加锁操作。默认情况下,不使用of子句表示在select所有的数据表中加锁。

加锁行为子句:当我们进行for update的操作时,与普通select存在很大不同。一般select是不需要考虑数据是否被锁定,最多根据多版本一致读的特性读取之前的版本。加入for update之后,Oracle就要求启动一个新事务,尝试对数据进行加锁。如果当前已经被加锁,默认的行为必然是block等待。使用nowait子句的作用就是避免进行等待,当发现请求加锁资源被锁定未释放的时候,直接报错返回。

在日常中,我们对for update的使用还是比较普遍的,特别是在如pl/sql developer中手工修改数据。此时只是觉得方便,而对for update真正的含义缺乏理解。
For update是Oracle提供的手工提高锁级别和范围的特例语句。Oracle的锁机制是目前各类型数据库锁机制中比较优秀的。所以,Oracle认为一般不需要用户和应用直接进行锁的控制和提升。甚至认为死锁这类锁相关问题的出现场景,大都与手工提升锁有关。
所以,Oracle并不推荐使用for update作为日常开发使用。而且,在平时开发和运维中,使用了for update却忘记提交,会引起很多锁表故障。 那么,什么时候需要使用for update?就是那些需要业务层面数据独占时,可以考虑使用for update。场景上,比如火车票订票,在屏幕上显示邮票,而真正进行出票时,需要重新确定一下这个数据没有被其他客户端修改。所以,在这个确认过程中,可以使用for update。这是统一的解决方案方案问题,需要前期有所准备。

你可能感兴趣的:(oracle,开闭原则,数据库)