ATP实例执行并行DML报ORA-12839错误 如何无需改代码禁用并行DML
ATP实例无需修改应用代码禁用并行DML(解决ORA-12839错误)
你遇到的ORA-12839 Cannot Modify An Object In Parallel After Modifying It错误是因为同一个事务内,先对表执行了并行DML操作后,又执行了其他串行操作导致的冲突,以下是无需修改应用代码的解决方案:
- 方案1:实例级全局禁用并行DML
使用ADMIN账号登录ATP实例,执行如下SQL修改系统参数:ALTER SYSTEM SET PARALLEL_DML_MODE = DISABLED SCOPE=BOTH;
参数生效后,整个实例所有会话默认关闭并行DML功能,即使SQL语句中携带parallel提示也不会触发并行DML,完全无需调整现有应用代码。 - 方案2:指定用户维度禁用并行DML
如果不需要全局禁用,只需要针对应用使用的数据库账号生效,可以创建登录触发器:
把代码中的CREATE OR REPLACE TRIGGER trg_disable_pdml_logon AFTER LOGON ON APP_SCHEMA.SCHEMA BEGIN EXECUTE IMMEDIATE 'ALTER SESSION DISABLE PARALLEL DML'; END; /APP_SCHEMA替换为你的应用实际使用的数据库用户名即可,仅该用户登录的会话会禁用并行DML,不影响其他用户的正常使用。 - 方案3:全局忽略SQL中的并行提示
如果不想完全关闭并行DML功能,只是要忽略SQL语句中写死的并行提示,可以修改如下参数:ALTER SYSTEM SET OPTIMIZER_IGNORE_PARALLEL_HINTS = TRUE SCOPE=BOTH;
该参数生效后,优化器会忽略所有SQL中的并行相关提示,你测试场景中UPDATE语句携带的/*+ parallel (objects) */提示会直接失效,也能解决报错问题。
验证方式:使用你提供的测试SQL重新执行,UPDATE和后续SELECT语句会正常运行,不会抛出ORA-12839错误。
内容的提问来源于stack exchange,提问作者Hermann Baer
相关产品推荐
相关产品推荐

