当然这应该与会话终止相同并导致回滚?在我看来,这是最不可能的甲骨文.当我发现它做到了这一点时,我感到非常震惊
更重要的是 - 如果Oracle在退出时将其更改为回滚,那么有人会反对吗?
这是甲骨文的一项设计决定,可能是20多年前制定的.这不是我会用的设计.请注意,它似乎是SQL*Plus的属性,而不是基础OCI的属性.
如果会话突然终止,AFAIK,会话将回滚,正如您所期望的那样.因此,例如,如果有人向SQL Plus发送SIGKILL ,则应回滚会话的事务.但是如果SQL Plus会话正常终止(EOF或退出命令),那么SQL*Plus无限智慧决定提交你到目前为止所做的一切.
至于为什么 - 我有一个理论.在SQL标准数据库中,即使您执行的唯一操作是SELECT语句,也始终处于事务中.如果您未提交,则会回滚您所做的任何更改.很容易忘记在脚本操作结束时添加提交,因此将其设置为默认行为会减少某人运行脚本以更改数据库然后运行第二个脚本以查看更改是否正确生效的次数.其他DBMS通过"自动提交"等模式消除了对此的需求,其中每个语句都是独立事务,在完成时自动提交.这是一种有用的操作方式.其他系统提供了一种模式,您可以在其中运行显式BEGIN WORK语句,然后(当然),您处于事务中直到相应的COMMIT或ROLLBACK.我被"MODE ANSI"数据库所困扰,并没有经常提交,以确保我在重要时提交,但我使用的软件(不是Oracle)仍然回滚未提交的工作,而不是默默地为你提交 - 我会如果改成工作则不高兴.(我认为可配置的默认值可能没问题;我仍然认为回滚未提交是更好的默认值,因为对于不知情的人来说这是一件令人讨厌的事情;不小心破坏数据库的危险,这对我来说至关重要.)
(适当的通知:这是来自为另一个DBMS供应商工作的人的二手信息.但是,据我所知,它是基于十多年期间积累的信息并在询问相关问题之后各种论坛.)