为什么 COMMIT 在立即执行后解决了问题?

Why COMMIT resolved the issue after execute immediate?

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

三分之二的 Oracle 服务器出现以下错误。甲骨文:11.2.0.4

ora 12841 cannot alter the session parallel DML state within a transaction

但是添加COMMIT后系统运行正常

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

为什么在添加 COMMIT 后没有看到该问题?

这个:

EXECUTE IMMEDIATE 'ALTER SESSION SET SKIP_UNUSABLE_INDEXES = TRUE';

...开始了一个新事务,之后您尝试更改会话并行 DML 状态。

COMMIT 完成事务并启动另一个事务,因此您随后可以更改会话并行 DML 状态。

此处的交易文档:https://docs.oracle.com/database/121/CNCPT/transact.htm

编辑:BEGIN 可能让您感到困惑。在 PostgreSQL 中,BEGIN 开始一个事务:http://www.postgresql.org/docs/9.1/static/sql-begin.html。在 Oracle "a transaction begins when the first executable SQL statement is encountered" 中。

如果您有一些语句在提到的块之前启动任何事务,就会发生此问题。

在我的例子中,导致错误的同义词很简单 select。在该事务之后添加提交后,该块执行良好。

即使在您的情况下,如果在以下语句执行之前添加 COMMIT 之后没有错误地执行,那么可以肯定有一些事务您缺少提交。

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

这 link 对我很有帮助 http://docs.oracle.com/cd/B28359_01/server.111/b28310/ds_admin004.htm#ADMIN12167

Thanks/Refer @DavidAldridge 更清楚