14

Surely this should be the same as a termination of a session and cause a rollback? It seems to me to be the most un-Oracle thing possible. I was actually shocked when I found out that it did this

More importantly - would anyone object if Oracle changed it to rollback on exit?

4

7 回答 7

18

有趣的是,在本周 (2009-09-03) 发布的 11gR2 中,SQL*Plus 现在可以在 EXIT 时选择 COMMIT 或 ROLLBACK。文档在这里

我猜在接下来的几周/几个月内,将会有一个 11gR2 即时客户端,您可以将其用于您当前的数据库并获得您想要的行为

需要注意的警告。如果您断开或连接到不同的会话,它仍将隐式提交事务(根据文档)。

于 2009-09-02T22:43:13.340 回答
6

这是甲骨文的设计决定,可能是 20 多年前做出的。这不是我会使用的设计。请注意,它似乎是 SQL*Plus 的属性,而不是底层 OCI 的属性。

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

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

注意事项:这是来自为另一家 DBMS 供应商工作的人提供的二手信息。然而,据我所知,它是准确的,并且基于十多年积累的信息以及在各种论坛。)

于 2009-09-02T14:52:46.400 回答
3

你得问甲骨文!

我必须承认,当我第一次发现这一点时,我感到很惊讶,因为您会认为它会采取更保守的方法,即进行 ROLLBACK。

我只能猜测 COMMIT 被认为是最有可能/默认的操作,也许这就是 SQL*Plus 这样做的原因?

于 2009-09-02T14:46:32.823 回答
1

好问题。

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

于 2009-09-02T20:48:07.657 回答
1

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

于 2011-08-10T07:33:44.147 回答
0

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

问候,罗布。

于 2009-09-02T15:19:02.800 回答
0

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

于 2016-02-18T09:11:59.050 回答