[转帖]ORA-12838: 无法在并行模式下修改之后读/修改对象_VMware, Unix及操作系统讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  VMware, Unix及操作系统讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2030 | 回复: 0   主题: [转帖]ORA-12838: 无法在并行模式下修改之后读/修改对象        上一篇   下一篇 
    本主题由 koei 于 2014-5-2 16:13:42 移动
lostever
注册用户
等级:列兵
经验:109
发帖:90
精华:0
注册:2013-5-27
状态:离线
发送短消息息给lostever 加好友    发送短消息息给lostever 发消息
发表于: IP:您无权察看 2013-6-3 15:23:40 | [全部帖] [楼主帖] 楼主

看到这个标题后,也许会有很多人发问,真会有这样的错误吗?是的,这样错误的提示一般是 ORA-12838: 无法在并行模式下修改之后读/修改对象

让通过一系列实验来模拟出这种错误:

当前表是有并行度的,并行度为4

SQL> select table_name,degree from user_tables where table_name=LJB_PARALLEL;
TABLE_NAME DEGREE
------------------------------
-----------------------------------
LJB_PARALLEL 4


向表中插入数据 

SQL> insert into
ljb_parallel select * from ljb_parallel2;
62644 rows inserted


不提交继续插入数据,问题马上出现了

SQL> insert into
ljb_parallel select * from ljb_parallel2;
insert into ljb_parallel select
* from ljb_parallel2


ORA-12838: 无法在并行模式下修改之后读/修改对象

SQL> select count(*) from
ljb_parallel;
select count(*) from
ljb_parallel


ORA-12838: 无法在并行模式下修改之后读/修改对象

真的报错了,这个时候对ljb_parallel表无论是更新还是查询都做不了了,咋回事?

SQL> commit;
Commit complete


提交后发现可以查询了

SQL> select count(*) from
ljb_parallel;
COUNT(*)
---------
187932


提交后更新也可以了

SQL> insert into
ljb_parallel select * from ljb_parallel2;
62644 rows inserted


总结:
过实验可以看出,如果并行的表更新未提交,在此基础上做任何操作无论更新还是查询都会失败,因此并行度的表其实还是有危险性的。从这里至少得出一个结论,
如果应用是多表分别插入带并行度的表,并且是有事务性,需要最后一起提交的,这个应用一定会失败!所以尽量避免把表本身的属性设置为并行,这样的话会留下
隐患,还是建议应用如果一定要用并行度,用HINT做设置就好了,因此最好最后要做如下操作

SQL> alter table ljb_parallel noparallel;
Table altered


另外如果表中只是索引有并行度,会存在这样的问题吗,实验如下,得出结论,只是表中索引有并行度,并不存在表带并行度的问题,不提交继续操作是不会报错的。 

SQL> create index
idx_ljb_parallel on ljb_parallel(object_id);
Index created
SQL> select
table_name,index_name,degree from
user_indexes where table_name=LJB_PARALLEL;
TABLE_NAME INDEX_NAME DEGREE
------------------------------
------------------------------ -----------------------------------------------------
LJB_PARALLEL IDX_LJB_PARALLEL 1
SQL> alter index IDX_LJB_PARALLEL parallel 4;
Index altered
SQL> select
table_name,index_name,degree from
user_indexes where
table_name=LJB_PARALLEL;
TABLE_NAME INDEX_NAME DEGREE
------------------------------
-------------------------------------------------------------------------------------
LJB_PARALLEL IDX_LJB_PARALLEL 4
SQL> insert into
ljb_parallel select * from ljb_parallel2;
62644 rows inserted
SQL> insert into
ljb_parallel select * from ljb_parallel2;
62644 rows inserted



有一次,我把结算系统互联互通指标报表的过程做了修改,修改处就是将其中的语句增加并行度,想提高运行的效率,修改完后我发现前台操作界面好象真的快了许
多。可是还没高兴多久,我发现前台查询的结果都是空的。再去跟踪数据库执行日志才发现,该过程执行根本中间就出错了,报ORA-12838。原来我这个过
程也是对结果表进行多次插入后一起提交了,结果表被我增加并行度后就不能继续操作未提交的数据,所以我的修改根本就是失败了!

这里说完了大家还记得我在前面的DML无法生效的时候说卖了个关子吗,希望看完本小节后,再回头考虑考虑,应该能明白了。

引申联想:高水平位插入的时候,也有类似的问题,比如使用append的时候,具体实验如下:

SQL> insert /*+append*/ into ljb_test
select * from ljb_test;
4 rows inserted
SQL> select * from ljb_test;
select * from ljb_test


ORA-12838: 无法在并行模式下修改之后读/修改对象

该贴由koei转至本版2014-5-2 16:13:42




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论