为什么退出时SQL * Plus会提交?

问题描述 投票:13回答:7

当然这应该与会话终止相同并导致回滚?在我看来,这是最不可能的甲骨文。当我发现它做到了这一点时,我感到非常震惊

更重要的是 - 如果Oracle在退出时将其更改为回滚,那么有人会反对吗?

oracle sqlplus
7个回答
18
投票

有趣的是,本周发布的11gR2版本(2009-09-03),SQL * Plus现在可以在EXIT上选择COMMIT或ROLLBACK。 Doc here

我想在接下来的几周/几个月里,会有一个11gR2的即时客户端,您可以使用它来对抗当前的数据库,并获得您想要的行为

需要注意的是谨慎。如果你DISCONNECT or CONNECT到另一个会话,它仍然会隐式提交事务(根据文档)。


6
投票

这是甲骨文的一项设计决定,可能是20多年前制定的。这不是我会用的设计。请注意,它似乎是SQL * Plus的属性,而不是基础OCI的属性。

如果会话突然终止,AFAIK,会话将回滚,正如您所期望的那样。因此,例如,如果有人向SQLPlus发送SIGKILL,则应回滚会话的事务。但是如果SQLPlus会话正常终止(EOF或退出命令),那么SQL * Plus凭借其无限的智慧决定提交你迄今为止所做的一切。

至于为什么 - 我有一个理论。在SQL标准数据库中,即使您执行的唯一操作是SELECT语句,也始终处于事务中。如果您未提交,则会回滚您所做的任何更改。很容易忘记在脚本操作结束时添加提交,因此将其设置为默认行为会减少某人运行脚本以更改数据库然后运行第二个脚本以查看更改是否正确生效的次数。其他DBMS通过“自动提交”等模式消除了对此的需求,其中每个语句都是独立事务,在完成时自动提交。这是一种有用的操作方式。其他系统提供了一种模式,您可以在其中运行显式BEGIN WORK语句,然后(当然),您处于事务中直到相应的COMMIT或ROLLBACK。我被“MODE ANSI”数据库所困扰,并没有经常提交,以确保我在重要时提交,但我使用的软件(不是Oracle)仍然回滚未提交的工作,而不是默默地为你提交 - 我会如果改成工作则不高兴。 (我想一个可配置的默认值可能没问题;我仍然认为回滚未提交是更好的默认值,因为它对于不知道的事情是一个麻烦;不小心破坏数据库的危险,这对我来说至关重要。)

(适当的通知:这是来自为另一个DBMS供应商工作的人的二手信息。但是,据我所知,它是基于十多年期间积累的信息并在询问相关问题之后各种论坛。)


3
投票

你不得不问Oracle!

我必须承认,当我第一次发现这一点时,我感到很惊讶,因为你认为采取更保守的做法是做回滚。

我只能猜测COMMIT被认为是最可能/默认的动作,也许这就是为什么SQL * Plus会这样做的?


1
投票

好问题。

我查看了metalink并且已经针对1998年正常退出时提交的默认行为提出了一个错误(或更改请求)。如果您有权访问metalink,请查找错误633247。


1
投票

与使用Oracle驱动程序的jdbc连接如何在关闭连接时隐式提交txn一致。


0
投票

我认为提交是一个好主意,我同意贾斯汀和比利在这个帖子中所写的内容:http://forums.oracle.com/forums/thread.jspa?messageID=3611345&#3611345

问候,Rob。


0
投票

在退出时提交对我来说似乎是合乎逻辑的事情,通常ROLLBACK是例外,当出现问题时我们回滚,当你插入,更新或删除数据然后你的意思是这样做,即COMMIT

© www.soinside.com 2019 - 2024. All rights reserved.