当然这应该与会话终止相同并导致回滚?在我看来,这是最不可能的甲骨文。当我发现它做到了这一点时,我感到很震惊
更重要的是 - 如果Oracle在退出时将其更改为回滚,那么有人会反对吗?
答案 0 :(得分:18)
有趣的是,本周发布的11gR2版本(2009-09-03),SQL * Plus现在可以在EXIT上选择COMMIT或ROLLBACK。文件here
我猜在接下来的几周/几个月里,会有一个11gR2的即时客户端,您可以使用它来对抗当前的数据库,并获得您想要的行为
要注意的注意事项。如果您DISCONNECT or CONNECT到另一个会话,它仍将隐式提交事务(根据文档)。
答案 1 :(得分:6)
这是甲骨文的一项设计决定,可能是在20多年前制定的。这不是我会用的设计。请注意,它似乎是SQL * Plus的属性,而不是基础OCI的属性。
如果会话突然终止,AFAIK,会话将回滚,正如您所期望的那样。因此,例如,如果有人向SQL Plus发送SIGKILL,则应回滚会话的事务。但是如果SQL Plus会话正常终止(EOF或退出命令),那么SQL * Plus以其无限的智慧决定提交到目前为止你所做的一切。
至于为什么 - 我有一个理论。在SQL标准数据库中,即使您执行的唯一操作是SELECT语句,也始终处于事务中。如果您未提交,则会回滚您所做的任何更改。很容易忘记在脚本操作结束时添加提交,因此将其设置为默认行为会减少某人运行脚本以更改数据库然后运行第二个脚本以查看更改是否正确生效的次数。其他DBMS通过“自动提交”等模式消除了对此的需求,其中每个语句都是独立事务,在完成时自动提交。这是一种有用的操作方式。其他系统提供了一种模式,您可以在其中运行显式BEGIN WORK语句,然后(当然),您处于事务中直到相应的COMMIT或ROLLBACK。我被“MODE ANSI”数据库所困扰,并没有经常提交,以确保我在重要时提交,但我使用的软件(不是Oracle)仍然回滚未提交的工作,而不是默默地为你提交 - 我会如果改成工作则不高兴。 (我认为可配置的默认值可能没问题;我仍然认为回滚未提交是更好的默认值,因为对于不知情的人来说这是一件令人讨厌的事情;不小心破坏数据库的危险,这对我来说至关重要。)
(适当通知:这是来自为其他DBMS供应商工作的人的第二手资料。但据我所知,这是准确的,并且基于在一段时间内积累的信息十多年后,在各种论坛上提出相关问题之后。)
答案 2 :(得分:3)
你必须问Oracle!
我必须承认,当我第一次发现这一点时,我感到很惊讶,因为你认为采取更为保守的方法会做一次ROLLBACK。
我只能猜测COMMIT被认为是最可能/默认的动作,也许这就是为什么SQL * Plus会这样做?
答案 3 :(得分:1)
好问题。
我查看了metalink,并且已经针对1998年正常退出时提交的默认行为提出了一个错误(或更改请求)。如果您有权访问metalink,请查找错误633247.
答案 4 :(得分:1)
与使用Oracle驱动程序的jdbc连接如何在关闭连接时隐式提交txn一致。
答案 5 :(得分:0)
我认为提交是一个好主意,我同意贾斯汀和比利在这篇帖子中所写的内容:http://forums.oracle.com/forums/thread.jspa?messageID=3611345�
此致 罗布。
答案 6 :(得分:0)
退出时提交似乎对我来说是合乎逻辑的,通常ROLLBACK
是例外,我们在出现问题时回滚,当你插入,更新或删除数据时,你的意思就是这样做COMMIT