快速业务通道

Weblogic执行transaction recover碰到的奇怪问题 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21
efault (self-tuning)''> <<WLS Kernel>> <> <> <1227179544296> <000000> <SQLException: SQLState(65000) vendor code(6550)>  ####<Nov 20, 2008 7:12:24 PM CST> <Debug> <JDBCDriverLogging> <why> <AdminServer> <[STANDBY] ExecuteThread: ''1'' for queue: ''weblogic.kernel.Default (self-tuning)''> <<WLS Kernel>> <> <> <1227179544296> <000000> <java.sql.SQLException: ORA-06550: line 1, column 7: PLS-00201: identifier ''SYS.DBMS_SYSTEM'' must be declared ORA-06550: line 1, column 7: PL/SQL: Statement ignored

碰到这种错误的时候,执行如下的SQL:grant execute on sys.dbms_system to system;

########################后续#####################

经过半天的调查,终于找到问题的原因了。问题出在Oracle XA Driver上,我们使用来自于不同datasource的XAConnection对同一个database操作的时候,我们把它们当作两个事务分支,分支ID如下:

Branch 1: 4F7261636C655841445331

Branch 2: 4F7261636C65584144533

如果这两个事务分支分别指向不同的database的话,global prepare时,xaResource.prepare()的结果应该为OK(prepare的时候,database工作正常)。而我们上面的测试中,因为操作的是统一database,其prepare的结果分别是:OK, READ_ONLY(数据库端认为该TX branch对应的操作不涉及数据修改)。返回READ_ONLY的时候,因为database认为该 tx branch不涉及数据修改,所以直接将它commit了。这也就解释了上面的疑问,global commit没有执行的时候,怎么就有tx branch被commit了。

下面再看看,为什么tlog中只能看到check point信息,而没有记录tx信息。在global prepare中,所有的参与该tx的resource的prepare结果返回后,weblogic需要根据vote结果决定进行global commit or global rollback。如果所有resource prepare都没问题的话,则将进行global commit。而在global commit之前,weblogic需要判断是否要将该tx信息记录到tlog中,而是记录tx的依据就是vote结果为0(OK)的resource个数是否大于1。大于1,则记入tlog,否则不做记录。我们上面的测试中,因为只涉及两个resource,而这两个resource的vote结果分别为:0(OK), 3(READ_ONLY),所以该tx信息没有被记录到tlog中。

weblogic在recover的时候,首先检查tlog中的tx信息,如果存在tx,则读取tx信息,并将该tx放入到当前 server的txMap中。然后调用xaResource.recover(),该方法的执行结果是,resource manager(如database, jms server)返回自己手里的pending transaction的xid list。 weblogic遍历该xid list,如果发现某个xid在当前txMap中,则忽略它(该tx将会被其他线程commit),那些不在txMap中的xid将会被 rollback,通过xaResource.rollback(Xid xid)实现。在我们上面的测试中,因为tx没有被记录到tlog中,所以weblogic在recover的时候会将database返回的xid: 0000669563242B7A1CFC-4F726163656C58414453 rollback。由于Oracle Driver的特殊处理,两个connection上的两个tx branch被合并成了一个branch(另一个被它认为是个READ_ONLY),所以在rollback的时候,test, test1两表上的数据都被rollback了。

在使用两个不同的database测试中,能够看到tlog中的tx信息,weblogic server重启后,也能看到tx的commit。tlog信息如下:

最后再说一下weblogic执行global prepare时,resource的prepare顺序:

1:remote xa resource

2:local xa resource

3:non-XA

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号