
在Oracle数据库的事务管理中,SAVEPOINT 是一个用于设置部分回滚点的重要命令。对于以下两个关于SAVEPOINT的陈述,正确的选项是?
A、回滚到SAVEPOINT可以撤销DELETE语句
B、在一个事务中只能发出一个SAVEPOINT
C、回滚到SAVEPOINT可以撤销TRUNCATE语句
D、SAVEPOINT 不会执行 COMMIT 操作
E、回滚到SAVEPOINT可以撤销CREATE INDEX语句
核心机制解析
SAVEPOINT 的作用是在一个长事务中标记一个“存档点”。其核心行为是:
- 不会结束当前事务:执行
SAVEPOINT sp1;命令本身并不会提交或回滚事务,事务依然处于活跃状态。因此,D选项“SAVEPOINT 不会执行 COMMIT 操作”是正确的。
- 支持部分回滚:后续可以通过
ROLLBACK TO sp1;将数据状态回滚到设置该保存点时的样子,但此操作不会结束整个事务,回滚后事务仍可继续执行其他操作。
- 数量无限制:在一个事务内,可以声明多个不同的
SAVEPOINT,因此B选项“在一个事务中只能发出一个SAVEPOINT”是错误的。
选项逐项辨析
了解 Oracle 中不同 SQL 语句的事务特性,是理解SAVEPOINT适用范围的关键。
- A. 回滚到SAVEPOINT可以撤销DELETE语句:正确。
DELETE属于标准的DML(数据操纵语言)操作,在事务范围内执行,可以被SAVEPOINT捕获并回滚。
- C. 回滚到SAVEPOINT可以撤销TRUNCATE语句:错误。
TRUNCATE是DDL(数据定义语言)语句。在Oracle中,执行DDL语句会触发一个隐式的提交(COMMIT),该提交会立即生效并结束前一个事务。由于事务已经结束,其前后的SAVEPOINT也随之失效,因此无法回滚。
- E. 回滚到SAVEPOINT可以撤销CREATE INDEX语句:错误。
CREATE INDEX同样属于DDL语句。与TRUNCATE同理,DDL语句的隐式提交特性使得它不在SAVEPOINT和ROLLBACK的控制范围之内。关于数据库对象的定义操作,通常需要更谨慎的事务规划。
总结
因此,正确的两个陈述是 A 和 D。
SAVEPOINT是进行精细化和复杂数据库事务控制的有效工具,但它主要作用于DML操作。理解DDL语句的隐式提交特性,是避免事务控制逻辑错误的关键。
|