这个PL / SQL代码符合ACID吗?

时间:2012-06-01 11:32:02

标签: oracle plsql acid

在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的版本不同?或者我错了,可能会有区别?

1 个答案:

答案 0 :(得分:1)

总之:不。 ACID中的D代表持久性,这意味着提交100%保证即使数据库在之后立即崩溃也会保留事务。异步提交为违反ACID的这一方面提供了一个机会窗口。

有关使用异步提交的优缺点的更多信息,请访问:http://www.orafaq.com/node/93