

点击上方



今天在墨天轮上看到一个题目,如上图所示,我们现在来分析解答一下。尽管两个表都有数据,但在Oracle数据库中,CREATE TABLE
和INSERT
语句在事务管理上表现出一些特别的特性。这些特性与ROLLBACK
命令的交互方式密切相关。这里涉及的核心原理是DDL(数据定义语言)和DML(数据操纵语言)在事务处理上的差异。下面是详细解释:
DDL操作和事务
DDL(数据定义语言)操作,如CREATE TABLE
,在Oracle数据库中是自动提交的。这意味着,一旦执行了如CREATE TABLE
的DDL语句,Oracle会立即提交之前的任何未提交的事务,并立即执行DDL语句。这是因为DDL操作不仅更改了数据,还更改了数据库的结构。因此,执行DDL操作时,Oracle确保通过提交任何挂起的事务来保持数据一致性和结构定义的一致性。
当你执行
create table ceshi
和create table ceshi2 as select * from ceshi;
这样的DDL语句时,Oracle会自动提交这两个命令前的所有挂起的DML操作(如INSERT
)。
DML操作和事务
DML(数据操纵语言)操作,如
INSERT
,是可以回滚的。这意味着,如果你在一个事务中执行了多个INSERT
操作然后执行了ROLLBACK
命令,所有的INSERT
操作都会被撤销,数据将回到事务开始前的状态。
为什么ceshi和ceshi2表都有数据?

对
ceshi
表的操作:当你执行
insert into ceshi values (1,'ceshi1');
和insert into ceshi values (2,'ceshi2');
后,这些数据插入操作被记录在当前事务中。然后,当你执行
create table ceshi2 as select * from ceshi;
这条DDL语句时,Oracle自动提交了之前的事务,这包括了对ceshi
表的两个INSERT
操作。因此,即使之后执行了ROLLBACK
,ceshi
表中的数据也不会被撤销,因为它们已经被自动提交了。对
ceshi2
表的操作:create table ceshi2 as select * from ceshi;
是一个DDL语句,它自动提交,并立即生效,创建了ceshi2
表并复制了ceshi
的内容。由于DDL操作是自动提交的,所以ceshi2
表的创建和数据填充是立即生效的,不受后续ROLLBACK
命令的影响。

结 论

ROLLBACK,
ROLLBACK操作不会对
ceshi和
ceshi2表有任何影响。这是因为:
对 ceshi
表的INSERT
操作在执行CREATE TABLE ceshi2
语句时已经被自动提交了。CREATE TABLE ceshi2
作为DDL操作,自身就是自动提交的,所以即使执行了ROLLBACK
,之前的DDL操作(包括表的创建和数据的复制)也不会被撤销。
扫描下方二维码或添加作者微信,回复“加群”即可开启你的数据库和IT学习之旅。加入我们,你将获得不仅仅是知识,多位业内数据库ACE大佬镇场+免费GPT4资源+Oracle MOS免费服务,很多志同道合的小伙伴,欢迎加群一起探讨、一起学习、一起进步!





