【问题标题】:Is this PL/SQL code ACID compliant?这个 PL/SQL 代码是否符合 ACID?
【发布时间】:2012-06-01 11:32:01
【问题描述】:

可以在 TEMPORARY 表上发出异步提交吗?是否会降低我的交易持久性?

CREATE GLOBAL TEMPORARY TABLE my_table_tmp (id number) ON COMMIT PRESERVE ROWS;
CREATE TABLE my_table (id number);

BEGIN
  INSERT --+ append
  INTO my_table_tmp (id)
  SELECT rownum 
  FROM all_objects;

  COMMIT WRITE BATCH NOWAIT; -- continue working without waiting on LGWR

  INSERT INTO my_table (id)
  SELECT id 
  FROM my_table_tmp;

  COMMIT; -- actually preserve transaction
END;
/

编辑:

是的,我知道它不是严格意义上的 ACID,因为它会在一瞬间绕过 D 部分。问题是 - 它是否“和”ACID 一样好,因为它与只使用真正 COMMIT 的版本没有任何不同的可能场景?还是我弄错了,可能有区别?

【问题讨论】:

  • 您知道只需一条语句就可以做到这一点吗?
  • 我知道。这只是我打算做的最简单的例子。

标签: oracle plsql acid


【解决方案1】:

一句话:没有。 ACID 中的 D 代表 Durability,这意味着即使数据库在之后立即崩溃,提交 100% 也能保证事务被保留。异步提交为违反 ACID 的这一方面提供了机会。

更多关于使用异步提交的优点/缺点的信息在这里:http://www.orafaq.com/node/93

【讨论】:

  • 是的,我在询问之前阅读了那篇文章。如果数据库在执行第二次插入时崩溃,COMMIT 和 COMMIT WRITE BATCH NOWAIT 有什么区别?我应该关心我无法恢复临时表中的数据吗?
  • 不同之处在于,通过常规提交,如果数据库在第二次插入期间失败,您的第一次插入将被保留。使用异步提交,如果数据库在重做日志写入操作期间失败,则可能不会保留第一个插入。这对您是否重要取决于具体情况,您可以选择以速度换取耐用性。
  • 我知道第一个插入可能会丢失。问题是 - 这在这个特定的示例代码中重要吗?如果其中只有非永久性更改,我丢失重做是否重要?注意第一个表上的 TEMPORARY 关键字。
  • 它是否重要的​​问题完全取决于对您的实施而言什么是重要的。如果您不担心临时表数据可能会在故障期间丢失,那么异步提交是一个非常合理的选择。
猜你喜欢
  • 2021-11-14
  • 2010-10-02
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 1970-01-01
  • 2010-10-12
相关资源
最近更新 更多