10

尝试从 Java 调用 PL/SQL 存储过程时出现以下错误:ORA-02089: COMMIT is not allowed in a subordinate session

它从 Oracle 测试良好。有人对这个有经验么?

4

3 回答 3

13

试试这种方法;

  • 更改数据源以使用非 XA(并选中“支持全局事务”和“模拟两阶段提交”按钮)
  • 从您的代码中删除 COMMIT。
  • 使用“PRAGMA AUTONOMOUS_TRANSACTION”。这将创建一个允许使用提交的单独事务。例如:CREATE PROCEDURE XXX AS PRAGMA AUTONOMOUS_TRANSACTION; 开始……</li>
于 2012-08-14T05:06:59.463 回答
4

oracle 文档对错误有什么看法:

COMMIT 在不是两阶段提交全局协调器的会话中发出。

基本上你正在执行一个分布式事务。作为分布式事务的一部分,您正在尝试调用自治事务。这是不可能的,因为分布式事务需要执行 2PC。

于 2012-08-14T04:58:17.650 回答
0

嗯,我认为它与XA有关。当我用AUTONOMOUS_TRANSACTION Pragma将存储过程括起来时,它工作正常:

PROCEDURE foo (val IN VARCHAR2(4000)) is
  PRAGMA AUTONOMOUS_TRANSACTION;
  BEGIN
  INSERT INTO tbl1 VALUES (val);
  DELETE FROM tbl2;
  COMMIT;
END foo;
于 2012-08-13T14:22:52.997 回答