这是甲骨文的设计决定,可能是 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 供应商工作的人提供的二手信息。然而,据我所知,它是准确的,并且基于十多年积累的信息以及在各种论坛。)