问题描述
嗨,汤姆,
我有一个SQL脚本。因为我正在创建备份表,比如表A。之后,我将使用某些条件 (没有提交) 更新表A。之后,我正在创建另一个备份表,例如表B。之后,我用一些条件 (没有提交) 更新表B。所有这些条件都在我的SQL脚本中。
我的假设是,当您更新表时,更改将仅针对该特定会话可见 (与SQL脚本中发出的DDL语句无关)。只有当我们显式发布commit语句时,它才对其他会话可见。
我的同事语句是 (这有点令人困惑),如果我们使用DDL语句和更新语句再次在一个单一的SQL脚本中另一个DDL语句和更新语句,它将自动提交该特定会话。请让我知道哪个陈述是明确和正确的 (我的假设或我的同事假设
我有一个SQL脚本。因为我正在创建备份表,比如表A。之后,我将使用某些条件 (没有提交) 更新表A。之后,我正在创建另一个备份表,例如表B。之后,我用一些条件 (没有提交) 更新表B。所有这些条件都在我的SQL脚本中。
我的假设是,当您更新表时,更改将仅针对该特定会话可见 (与SQL脚本中发出的DDL语句无关)。只有当我们显式发布commit语句时,它才对其他会话可见。
我的同事语句是 (这有点令人困惑),如果我们使用DDL语句和更新语句再次在一个单一的SQL脚本中另一个DDL语句和更新语句,它将自动提交该特定会话。请让我知道哪个陈述是明确和正确的 (我的假设或我的同事假设
专家解答
你的同事是正确的。
DDL包括语句前后的隐式提交。所以如果你通过脚本创建一个表格,你已经发出了一个提交:
这样其他人就可以查看您的更改。并且在创建它之前不能回滚到。
尽管18c确实为该规则带来了例外。私有临时表。您可以回滚到创建之前:
尽管回滚也会破坏您的PTT:
您需要设置on commit子句来保留定义以避免这种情况。但是无论您做什么,当您的会话结束时,PTT都消失了!
DDL包括语句前后的隐式提交。所以如果你通过脚本创建一个表格,你已经发出了一个提交:
create table t1 ( c1 int ); insert into t1 values ( 1 ); create table t2 ( c1 int ); insert into t2 values ( 1 ); rollback; select * from t1; C1 1 select * from t2; no rows selected
这样其他人就可以查看您的更改。并且在创建它之前不能回滚到。
尽管18c确实为该规则带来了例外。私有临时表。您可以回滚到创建之前:
insert into t1 values ( 2 ); select * from t1; C1 2 1 create private temporary table ora$ptt_t ( c1 int ); insert into ora$ptt_t values ( 1 ); rollback; select * from t1; C1 1
尽管回滚也会破坏您的PTT:
select * from ora$ptt_t; SQL Error: ORA-00942: table or view does not exist
您需要设置on commit子句来保留定义以避免这种情况。但是无论您做什么,当您的会话结束时,PTT都消失了!
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




