【问题标题】:How often to COMMIT/EXECUTE in Oracle via Access VBA通过 Access VBA 在 Oracle 中提交/执行的频率
【发布时间】:2018-02-13 15:32:07
【问题描述】:

我在 Access / VBA 中运行以下代码以插入到 Oracle 表中(为了效果而修剪了 SQL,但需要 2 个单独的语句)

Dim mydb            As DAO.Database
Dim myq             As DAO.QueryDef

Set mydb = DBEngine.Workspaces(0).Databases(0)
Set myq = mydb.CreateQueryDef("")

With myq
    .SQL = "INSERT INTO tbltrailnew..."
    .Execute 'Execute SQL
    .SQL = "Commit" 'Commit changes to database
    .Execute 'Execute SQL
    .SQL = "INSERT INTO tbltrailnew..."
    .Execute 'Execute SQL
    .SQL = "Commit" 'Commit changes to database
    .Execute 'Execute SQL
    .Close 'Close connection
End With

由于我不熟悉 Oracle,我的问题是 - 我是否执行和提交了不必要的次数?如果是这样,我的代码如何被剥离?

【问题讨论】:

  • 您是否正确提交取决于您的应用程序的设计方式。一些关于数据库事务/逻辑工作单元的阅读将为您提供可以应用于任何应用程序的原则。

标签: sql oracle ms-access vba


【解决方案1】:

虽然@StephaneM 有观点,但这是我的看法:

是的,当您本质上只是在执行一个链接操作时,您只能提交一次,通常这比提交多次要好。

提交只是意味着:确保我刚刚所做的一切都永久写入数据库。如果您在上面发布的 sub 中途失败,并且您已经提交了一些插入,则不能重新运行 sub,否则您将提交两次。

如果你在 sub 结束时提交,如果运行时出现错误,你可以再次运行它。

删除您的第一个提交就是我要更改的全部内容。

【讨论】:

    【解决方案2】:

    一般来说,您应该在每次交易后提交。从您的示例看来,对一个表的两次插入似乎不是两个事务,因此您最后应该只有一个提交。

    定义交易的一个简单类比是 ATM 灰分提取。每按一次按钮,直到提款为止,都构成一次交易。一旦你收到你的现金,你就会有一个承诺。如果您没有收到现金,那就是回滚。每次按下按钮都不能成为交易,否则您可能会在要钱时做出承诺,然后收不到现金。

    过度提交可能会导致问题,因为 Oracle 必须在后台执行大量工作才能将事务写入磁盘。如果一行中有大量的insert,比如数据加载,我们一般在5000到10000左右之后commit。大量delete也是一样。

    您还可以研究如何使用 BULK COLLECT 和 FORALL / INSERT 来最大程度地减少服务器和客户端之间的往返。仅当您计划执行大量 DML(插入/更新/删除)时才这样做。

    【讨论】:

      【解决方案3】:

      这实际上不是 Oracle 相关的问题。这一切都与您的数据有关。您应该问自己的问题是,如果任何插入失败,我该怎么办?我应该执行另一个插入吗?我应该回滚/不执行其他插入吗?

      只需选择能使您的数据库保持一致状态的解决方案。

      【讨论】:

        猜你喜欢
        • 2014-07-01
        • 1970-01-01
        • 2012-03-23
        • 1970-01-01
        • 2010-11-05
        • 1970-01-01
        • 2017-04-11
        • 1970-01-01
        • 2016-07-17
        相关资源
        最近更新 更多