多年前在 Oracle 8 工作时,我曾经在每次批量 INSERT 后手动执行 COMMIT 命令。在 SQL Server 中,Auto-Commit 默认为 ON,它有优点也有危险。
我想知道较新版本的Oracle是否仍然默认关闭Auto-Commit?我还想知道如何在 SQL Server 2005 中关闭自动提交。
多年前在 Oracle 8 工作时,我曾经在每次批量 INSERT 后手动执行 COMMIT 命令。在 SQL Server 中,Auto-Commit 默认为 ON,它有优点也有危险。
我想知道较新版本的Oracle是否仍然默认关闭Auto-Commit?我还想知道如何在 SQL Server 2005 中关闭自动提交。
甲骨文
来自 2000 年的 AskTom:
这仍然是正确的,并且可能永远都是。有关详细说明,
commit
请参阅Oracle 文档SQL Server 2000+
从 SO(倒置):
或者,如果您愿意,可以从文档(或 Mark 的更直接链接)中获取
对于 SQL Server,您将SET IMPLICIT_TRANSACTIONS ON。
在隐式事务模式下,任何 DML (
SELECT, INSERT, DELETE, UPDATE
etc) 或 DDL (CREATE, ALTER, DROP
etc) 都会启动事务,您必须显式地COMMIT
或ROLLBACK
.或者,可以使用 启动显式事务
BEGIN TRANSACTION
。正如上面已经回答的那样,在 SQL 中,您可以为与该
SET IMPLICIT_TRANSACTIONS ON
设置的连接设置隐式事务,并使用 Mark 和 Jack 提供的链接。我会告诫不要考虑全面这样做,甚至经常在你自己的关系中这样做。进行此更改的另一面是您现在拥有所有操作的事务。如果您自己没有正确管理或清理,您现在可以在系统中阻塞 DML 的未决事务。
如果您担心在手动清理时意外删除/更新错误的行,有一些更好的选择:
BEGIN TRANSACTION
在从系统中编写更新/插入/删除之前养成打字的习惯......有时我会开始一个会话并输入
(注释掉所以它不会发生但输入它所以我不会忙着忘记)
然后我会在开始 tran 之后做我的工作,在同一个会话中编写一个 select 语句,显示后的图片,以确保我没有搞砸(或者只是依赖受影响的行数等),然后如果一切看起来都不错,请提交。
嗯......严格来说,Oracle 没有自动提交模式并非如此。如果您查看底层 OCI,您可以看到有一个
OCI_COMMIT_ON_SUCCESS
可以传递给的标志OCIStmtExecute()
。你为什么要这样做?好吧,如果您使用的是非常常见的模式,即 INSERT→COMMIT→INSERT→...(例如,在记录时间序列数据时),那么这会使您需要执行的网络往返次数减半,这可能是一个非常显着的性能提升使用此标志,尤其是在 WAN 链接上。如果你
OCI_DEFAULT
作为标志传递,那么是的,自动提交是关闭的,所以这是默认行为。在 SQL server(用 SQL2005 测试)中,要在服务器级别设置自动提交,您可以使用上面其他人解释的 TSQL,也可以使用 SSMS GUI。要使用 SSMS:
如果未选中该框,则表示自动提交已打开。如果选中该框,则表示自动提交已关闭。