2015-04-05 126 views
4
BEGIN 
    EXECUTE IMMEDIATE 'ALTER SESSION SET SKIP_UNUSABLE_INDEXES = TRUE'; 
    EXECUTE IMMEDIATE 'ALTER SESSION DISABLE PARALLEL DML' ; 
END; 
/

3個oracle服務器中有1個出現跟隨錯誤。甲骨文:11.2.0.4爲什麼COMMIT在立即執行後解決了問題?

ORA 12841不能改變會話並行DML狀態 交易

內,但凱明

BEGIN 
    EXECUTE IMMEDIATE 'ALTER SESSION SET SKIP_UNUSABLE_INDEXES = TRUE'; 
    COMMIT; 
    EXECUTE IMMEDIATE 'ALTER SESSION DISABLE PARALLEL DML' ; 
END; 
/

加入後的系統工作得很好,爲什麼沒有看到問題添加COMMIT後?

回答

2

如果您有一些語句啓動提到的塊之前的任何事務,則會發生此問題。

在我的情況下,從導致錯誤的同義詞中選擇簡單。在該事務之後添加提交後,該塊將執行正常。

即使在你的情況下,如果在下面的語句執行之前添加COMMIT之後執行沒有錯誤,那麼它肯定會有一些事務缺少提交。

COMMIT; 
EXECUTE IMMEDIATE 'ALTER SESSION SET SKIP_UNUSABLE_INDEXES => TRUE'; 
EXECUTE IMMEDIATE 'ALTER SESSION DISABLE PARALLEL DML' ; 

對我來說,這個鏈接是有幫助的 http://docs.oracle.com/cd/B28359_01/server.111/b28310/ds_admin004.htm#ADMIN12167

感謝/參考@DavidAldridge更加清晰

2

此:

EXECUTE IMMEDIATE 'ALTER SESSION SET SKIP_UNUSABLE_INDEXES = TRUE'; 

...開始一個新的事務,之後就試圖改變會話並行DML狀態。

COMMIT完成了事務並開始了另一個事務,因此您可以更改會話並行DML狀態。

文件放在這裏交易:https://docs.oracle.com/database/121/CNCPT/transact.htm

編輯:可能是開始是成功的迷惑你。在PostgreSQL中,BEGIN啓動一個事務:http://www.postgresql.org/docs/9.1/static/sql-begin.html。在Oracle中,「遇到第一個可執行SQL語句時開始一個事務」。

+0

如果凱明是必須有那麼爲什麼它不是在所有Oracle服務器打破。此問題僅在1臺服務器中出現,而其他服務器中的COMMIT沒有COMMIT的情況下語句正常工作。 – touchchandra 2015-04-05 14:43:25

+1

嗯,我不知道是否可能是「ALTER SESSION SET SKIP_UNUSABLE_INDEXES = TRUE」不是什麼啓動交易,但另一個聲明之前呢?如果在一臺服務器上前面的語句沒有被執行,那麼它就可以解釋不同之處。 – 2015-04-05 14:47:13

+0

你可能會嘗試連接到數據庫,執行COMMIT,執行「SELECT XID FROM V $ TRANSACTION;」,然後「ALTER SESSION SET SKIP_UNUSABLE_INDEXES = TRUE」,然後選擇「XID FROM V $ TRANSACTION;」再次。發佈select語句返回的內容。 – 2015-04-05 14:49:50