文档解释
ORA-12838: 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.
官方解释
“ORA-12838:在并行操作期间修改对象后,不能读取/修改该对象。这通常表明在并发模式下对对象进行了修改,然后又试图再次读取/修改它。”
常见案例
某些操作会触发此错误,比如,需要更新表和视图的DDL操作;插入新行时,行唯一索引的约束被违反;如果某个事务正在搜索表行,而另一个并发事务正在修改或添加行,此错误也很容易发生。
正常处理方法及步骤
1. 检查并发系统(共享模式)中是否同时读取和写入同一数据,确保没有这样的情况发生。
2. 尝试在事务程序中使用“for update nowait”子句,并将其值更改为“for update wait x”,其中x 指示行多长时间将被锁定。
3. 围绕事务程序和并发系统选择正确的隔离级别,可能用到READ COMMITTED,SERIALIZABLE 或 READ ONLY。
4. 确保在多实例环境中服务程序的正确配置。
5. 如果数据库是Oracle 10g或更高版本,可以考虑在表中启用“ROW-LEVEL LOCKING”,它可以确保只有一个并发事务在修改特定的数据行时才可以写入数据行,而其他并发事务只能在更新之前或之后进行。