insert插入数据时报错:
SCOTT@prod>insert /*+ append */ into scott.employee select * from scott.employee ; 3584 rows created. SCOTT@prod>/ insert /*+ append */ into scott.employee select * from scott.employee * ERROR at line 1: ORA-12838: cannot read/modify an object after modifying it in parallel
查看表并行度
SQL> select a.degree from dba_tables a where a.table_name='EMPLOYEE'; DEGREE ----------- 1
查看锁信息
SELECT o.object_name, o.owner, l.locked_mode, s.sid, s.serial#, s.logon_time FROM v$locked_object l, dba_objects o, v$session s WHERE l.object_id = o.object_id AND l.session_id = s.sid AND o.object_name = 'EMPLOYEE'; OBJECT_NAME OWNER LOCKED_MODE SID SERIAL# LOGON_TIME ---------------- ------- ----------- ---------- ---------- ----------- EMPLOYEE SCOTT 6 80 5328 2019/11/24
ora-12838错误
SCOTT@prod>!oerr ora 12838 12838, 00000, "cannot read/modify an object after modifying it in parallel" // *Cause: Within the same transaction, an attempt was made to add read or // modification statements on a table after it had been modified in parallel // or with direct load. This is not permitted. // *Action: Rewrite the transaction, or break it up into two transactions: // one containing the initial modification and the second containing the // parallel modification operation.
append会在高水位之上插入数据并且生成较少的redo数据,加快速插入速度的同时会持有一个排它锁,对于执行后未提交的事务容易引发该问题。
MOS相关文档
ORA-12838 with Direct Load Inserts (文档 ID 116494.1) PARALLEL RESTRICTIONS:A transaction can contain multiple parallel DML statements that modilydifferent tables, but after a parallel DML statement modifies a table, NO subsequent serial or Parallel statment (DML or QUERY) can access thesame table again in that transaction.***Each insert in SQL*plus is considered a transaction, while the wholePL/SQL BLOCK is considered a transation.