AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 7087
Accepted
RPK
RPK
Asked: 2011-10-23 02:25:55 +0800 CST2011-10-23 02:25:55 +0800 CST 2011-10-23 02:25:55 +0800 CST

SQL Server 和 Oracle 中的自动提交

  • 772

多年前在 Oracle 8 工作时,我曾经在每次批量 INSERT 后手动执行 COMMIT 命令。在 SQL Server 中,Auto-Commit 默认为 ON,它有优点也有危险。

我想知道较新版本的Oracle是否仍然默认关闭Auto-Commit?我还想知道如何在 SQL Server 2005 中关闭自动提交。

sql-server oracle
  • 5 5 个回答
  • 14999 Views

5 个回答

  • Voted
  1. Best Answer
    Jack Douglas
    2011-10-23T02:40:12+08:002011-10-23T02:40:12+08:00

    甲骨文

    来自 2000 年的 AskTom:

    ...Oracle 操作的唯一方法是“客户端告诉我们何时提交”。我们没有自动提交模式。各种工具和 API 的作用(例如:我可以告诉 sqlplus 自动提交,这只是意味着 sqlplus 将在每个语句之后发出提交)。

    这仍然是正确的,并且可能永远都是。有关详细说明,commit请参阅Oracle 文档

    SQL Server 2000+

    从 SO(倒置):

    您可以通过设置implicit_transactions ON 来关闭自动提交

    或者,如果您愿意,可以从文档(或 Mark 的更直接链接)中获取

    • 7
  2. Mark Storey-Smith
    2011-10-23T02:46:45+08:002011-10-23T02:46:45+08:00

    对于 SQL Server,您将SET IMPLICIT_TRANSACTIONS ON。

    在隐式事务模式下,任何 DML ( SELECT, INSERT, DELETE, UPDATEetc) 或 DDL ( CREATE, ALTER, DROPetc) 都会启动事务,您必须显式地COMMIT或ROLLBACK.

    或者,可以使用 启动显式事务BEGIN TRANSACTION。

    • 5
  3. Mike Walsh
    2011-10-23T06:09:30+08:002011-10-23T06:09:30+08:00

    正如上面已经回答的那样,在 SQL 中,您可以为与该SET IMPLICIT_TRANSACTIONS ON设置的连接设置隐式事务,并使用 Mark 和 Jack 提供的链接。

    我会告诫不要考虑全面这样做,甚至经常在你自己的关系中这样做。进行此更改的另一面是您现在拥有所有操作的事务。如果您自己没有正确管理或清理,您现在可以在系统中阻塞 DML 的未决事务。

    如果您担心在手动清理时意外删除/更新错误的行,有一些更好的选择:

    1. 先做个备份
    2. 首先通过将所有行选择到新表中来备份表(Select * into tmpInCaseIMessUp_TableName_mw FROM TableName)
    3. BEGIN TRANSACTION在从系统中编写更新/插入/删除之前养成打字的习惯......

    有时我会开始一个会话并输入

    BEGIN TRAN
    
    -- COMMIT TRAN 
    

    (注释掉所以它不会发生但输入它所以我不会忙着忘记)

    然后我会在开始 tran 之后做我的工作,在同一个会话中编写一个 select 语句,显示后的图片,以确保我没有搞砸(或者只是依赖受影响的行数等),然后如果一切看起来都不错,请提交。

    • 4
  4. Gaius
    2011-10-25T04:57:19+08:002011-10-25T04:57:19+08:00

    嗯......严格来说,Oracle 没有自动提交模式并非如此。如果您查看底层 OCI,您可以看到有一个OCI_COMMIT_ON_SUCCESS可以传递给的标志OCIStmtExecute()。你为什么要这样做?好吧,如果您使用的是非常常见的模式,即 INSERT→COMMIT→INSERT→...(例如,在记录时间序列数据时),那么这会使您需要执行的网络往返次数减半,这可能是一个非常显着的性能提升使用此标志,尤其是在 WAN 链接上。

    如果你OCI_DEFAULT作为标志传递,那么是的,自动提交是关闭的,所以这是默认行为。

    • 4
  5. StanleyJohns
    2011-10-26T12:21:23+08:002011-10-26T12:21:23+08:00

    在 SQL server(用 SQL2005 测试)中,要在服务器级别设置自动提交,您可以使用上面其他人解释的 TSQL,也可以使用 SSMS GUI。要使用 SSMS:

    1. 打开 SSMS 并连接到您的 SQL 服务器。
    2. 在菜单栏上单击工具 > 选项。
    3. 在选项窗口中,展开“查询执行”>“SQL 服务器”。
    4. 单击“ANSI”。
    5. 检查\取消选中“SET IMPLICIT_TRANSACTIONS”复选框。

    如果未选中该框,则表示自动提交已打开。如果选中该框,则表示自动提交已关闭。

    • 3

相关问题

  • ORDER BY 使用文本列的自定义优先级

  • 舒服的sqlplus界面?[关闭]

  • 如何在数据库中找到最新的 SQL 语句?

  • 如何使用正则表达式查询名称?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve