2012-06-01 55 views
1

可以在TEMPORARY表上發出異步提交嗎?它是否會讓我的交易不再持久?此PL/SQL代碼是否兼容ACID?

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

我知道。這只是我打算做的最簡單的例子。 – jva

回答

1

總之:沒有。 ACID中的D表示Durability,這意味着即使數據庫在之後立即崩潰,提交100%也能保證事務被保留。異步提交爲ACID的這個方面提供了一個機會窗口被違反。

使用上的優勢/劣勢異步提交的更多信息是在這裏:http://www.orafaq.com/node/93

+0

是的,我在提問前閱讀過這篇文章。如果數據庫在執行第二次插入時崩潰,COMMIT和COMMIT WRITE BATCH NOWAIT會有什麼區別?我應該關心我無法恢復臨時表中的數據嗎? – jva

+0

區別在於,對於常規提交,如果數據庫在第二次插入期間失敗,則將保留第一次插入。使用異步提交時,如果數據庫在重做日誌寫入操作期間失敗,則可能無法保留第一次插入。無論這種情況對您而言是否重要都是個案分析,您可以選擇權衡速度以獲得耐用性。 – Datajam

+0

我知道第一次插入可能會丟失。問題是 - 在這個特定的示例代碼中這很重要嗎?無論如何,如果我失去了重做,如果只有非永久性的變化,這有什麼關係嗎?注意第一個表上的TEMPORARY關鍵字。 – jva