代码之家  ›  专栏  ›  技术社区  ›  Hal

Commit语句的用法

  •  1
  • Hal  · 技术社区  · 7 年前

    如何正确使用Commit语句?我是否必须对每个insert语句和每个函数使用commit语句?例如,如果我更改一个表以添加一列,我是否必须使用commit语句?

    4 回复  |  直到 7 年前
        1
  •  1
  •   MT0    7 年前

    如果您运行 DDL statement ( CREATE ,则, ALTER ,则, DROP ,则, GRANT ,等等),然后:

    Oracle数据库在每个DDL语句之前和之后隐式提交当前事务。

    如果运行DML语句( INSERT ,则, UPDATE ,则, DELETE ,则, SELECT ,则, CALL ,则, MERGE )然后:

    这些语句不会隐式提交当前事务。

    您需要手动提交未提交的事务(但不必 COMMIT 每次陈述后)。

    如果要执行部分回滚,则可以使用 SAVEPOINT s

    你不应该把 犯罪 函数或过程中的语句,以便您可以在单个事务中使用多个函数/过程,然后 犯罪 ROLLBACK 整个交易。

        2
  •  1
  •   Rene    7 年前

    更改表中的数据(插入、更新和删除)时需要提交。只要您不提交,其他用户就看不到更改的数据,您仍然可以通过执行回滚来撤消更改。

    没有必要在每一条语句之后提交。

    更改表本身(alter table)时不需要提交。事实上,alter table语句发出一个隐式提交。

    Some more on implicit/explicit commit statements in Oracle

        3
  •  0
  •   Ychdziu    7 年前

    根据积累的经验和“良好实践”,您不应该在您的功能/过程中执行“提交”语句(大多数情况下,取决于任务和您试图实现的目标)。“提交”的决定应该由调用您的函数/过程的用户来决定。 当发生/捕获异常时,您可以实现的是“回滚”。 通常,当从应用程序/web部件调用存储过程或函数时,它们是自动提交的(据我所知,至少在java中,该选项可以在事务方法中更改)。

        4
  •  -1
  •   Pawel Szalucki    7 年前

    试着这样做:

     try {
            // First of all, let's begin a transaction
            $db->beginTransaction();
    
            // A set of queries; if one fails, an exception should be thrown
            $db->query('first query');
            $db->query('second query');
            $db->query('third query');
    
            // If we arrive here, it means that no exception was thrown
            // i.e. no query has failed, and we can commit the transaction
            $db->commit();
        } catch (Exception $e) {
            // An exception has been thrown
            // We must rollback the transaction
            $db->rollback();
        }