暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 退出时意外提交

askTom 2018-06-15
513

问题描述

嗨,我希望我的SQL * Plus脚本在Skript中没有显式提交 (或回滚) 时在退出时进行回滚。所以我使用的是SQL * Plus的自动提交和EXITCOMMIT设置。

根据SQL * Plus参考手册在SET EXITCOMMIT部分中的描述,如果AUTOCOMMIT处于关闭状态,EXITCOMMIT处于关闭状态并且Exit没有COMMIT子句,则退出行为为回滚。

但实际上数据是提交的。我是否误解了此功能,或者它可能是SQL * Plus中的错误?

这里是一个示例,它以意外地将插入的记录提交到数据库而告终。

SET PAGESIZE 1000 NEWPAGE NONE
SET LINESIZE 5000 WRAP OFF

SET ECHO ON FEEDBACK ON

SET AUTOCOMMIT OFF
SET EXITCOMMIT OFF

WHENEVER SQLERROR EXIT 8 ROLLBACK;

INSERT INTO TAB1 SELECT MAX(I) + 1, 'Test COMMIT' FROM TAB1;

SELECT * FROM TAB1 ORDER BY 1;

SHOW AUTOCOMMIT 
SHOW EXITCOMMIT

--ROLLBACK

EXIT 0


顺便说一句,如果我省略了返回代码0,那么就会发生回滚!但是我需要脚本上下文中的那些返回代码。

问候海科

专家解答

出口有两种 “模式”

1) 只是简单的 “退出”
2) 退出2个选项 (返回代码和交易意图)

因此,当您传递回返回代码时,您已进入 “模式2”

模式2的事务意图的 * 默认 * 是提交,这就是为什么您看到所看到的。

你可以想到它SQLPlus说: “嘿,你有我一些退出的参数,所以我假设你在这里控制”

因此,您希望在其中包含explict rollback参数。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论