Bugs item #585632, was opened at 2002-07-23 18:24 You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=376685&aid=585632&group_id=22866
Category: JBossTX Group: v3.0 Rabbit Hole >Status: Open Resolution: Postponed Priority: 5 Submitted By: Igor Fedorenko (igorfie) Assigned to: Nobody/Anonymous (nobody) Summary: Problem with XA and Oracle Initial Comment: org.jboss.tm.TxCapsule#enlistResource(XAResource) has an optimization that is not compatible with Oracle. The problem occurs only when more then one connections to same database server try to participate in same distributed transaction. Here what happens 1. First db connection joins transaction; TxCapsules sees new resource manager/transaction pair and calls XAResource#start(xid1, XAResource.TMNOFLAGS); everything works fine. 2. When second db connection tries to join the transaction TxCapsule sees same RM/transaction pair and tries to call XAResource#start(xid1, XAResource.TMJOIN) to attach second connection to the transaction. This is not supported by Oracle and the call fails with XA_RETRY error code. It should be possible to turn this optimization on/off on per RM basis. As a temporary workaround I would disable this optimization (unless some other RM does not work without it). I am running Branch_3_0 on Win2k, JDK 1.3.1_04, Oracle 8173. ---------------------------------------------------------------------- Comment By: Igor Fedorenko (igorfie) Date: 2002-08-02 23:35 Message: Logged In: YES user_id=232950 Ok, you won :-). I wrote very simple jdbc driver that returns false for all isSameRM requests (thanks to Ole for the idea) and delegates everything else to oracle driver. Attached is source code and sample oracle-xa-service.xml. Unfortunately, the code needs oracle libraries to compile. Does it look like reasonable solution? -- Sincerely, Igor Fedorenko ---------------------------------------------------------------------- Comment By: Igor Fedorenko (igorfie) Date: 2002-08-02 23:34 Message: Logged In: YES user_id=232950 Ok, you won :-). I wrote very simple jdbc driver that returns false for all isSameRM requests (thanks to Ole for the idea) and delegates everything else to oracle driver. Attached is source code and sample oracle-xa-service.xml. Unfortunately, the code needs oracle libraries to compile. Does it look like reasonable solution? -- Sincerely, Igor Fedorenko ---------------------------------------------------------------------- Comment By: Scott M Stark (starksm) Date: 2002-08-02 11:14 Message: Logged In: YES user_id=175228 This is what JCA is for. You have a resource driver that does work with an app server JTA, create a JCA wrapper that get the two to talk. Write one and we'll include it. ---------------------------------------------------------------------- Comment By: Bill Burke (patriot1burke) Date: 2002-08-02 10:47 Message: Logged In: YES user_id=176497 Clustering code does not propagate transactional state. In fact, entity beans do not have a distributed cache. For SFSBs, we do replicate state, but replicated state is only distributed on transaction commit. If a node fails within a transaction, you failover to a new node with old committed state. ---------------------------------------------------------------------- Comment By: Ole Husgaard (sparre) Date: 2002-08-02 10:35 Message: Logged In: YES user_id=175257 We _do_ check for XA_RDONLY, and act upon it according the the spec. To see why starting a different branch for each XAResource breaks the spec, download the JTA 1.0.1 specification, and study it's requirements on isSameRM() and the use of start(TMNOFLAGS/TMJOIN). If Oracle wanted to comply with the spec, and have a new transaction branch for each connection, they could simply make isSameRM() always return false, unless called with the target of the method as the argument. That is what the isSameRM() method is for. Problem is, if we should handle such non-compliant drivers, we would have to have some kind of per-RM helper or proxy that takes care of each individual RM's specific spec violations. The Tyrex TM has this, and you may be able to make your driver work in JBoss by using Tyrex instead of the default TM. Best Regards, Ole Husgaard. P.S: I'm not familiar with the clustering code, and cannot answer questions about that. ---------------------------------------------------------------------- Comment By: Igor Fedorenko (igorfie) Date: 2002-07-23 21:59 Message: Logged In: YES user_id=232950 Oracle wants separate transaction branch for each db connection (TMNOFLAGS, same global transaction id, different branch qualifiers). You should also check for XA_RDONLY status from XAResource#prepare (I think this complies with the spec). You can find an appropriate example here http://www.oracle.co.jp/o8i/JServer/sources/jdbc/demo /samples/oci8/jdbc20-samples/XA3.java.txt. I agree that TMJOIN is suggested but I do not see why starting different transaction branches for each db connection would break the spec. As for suggested XA ConnectionManager it should work fine with oracle. Btw, does JBOSS share state of transaction among nodes of a cluster? If second connection was obtained on a different node would JBOSS still use TMJOIN? ---------------------------------------------------------------------- Comment By: Ole Husgaard (sparre) Date: 2002-07-23 20:57 Message: Logged In: YES user_id=175257 This is yet another problem with the Oracle driver. Please report it to Oracle - I think they loose market share big time because they do not conform to the JTA specification, and because they are so slow to fix these bugs. Currently I can only recommend against using Oracle with Java, because of this. But just like with the 8.1.5 "All XIDs are belong to us"-bug, that we got around by adding extra code, it might be possible to add some code that checks if the XAResource class is one of the Oracle classes that have this problem. Unfortunately that may give us yet another Oracle problem once they fix their bug, since TMJOIN _must_ be used here, according to JTA. Best Regards, Ole husgaard. ---------------------------------------------------------------------- Comment By: David Jencks (d_jencks) Date: 2002-07-23 19:20 Message: Logged In: YES user_id=60525 What does work with Oracle? Does it require all work on one tx go over the same connection or that other connections' XAResource get started with TMNOFLAGS or TMRESUME or ??? I've been considering writing a new XA ConnectionManager that would tie managedConnections to transactions, at least until you run out, to reduce the amount of enlist/delist activity. What do you think are the chances of this proposal solving the problem you have identified? My understanding is that calling TMJOIN is the spec required behavior, so I would expect it to break other drivers. However I find this area difficult to pin down as far as spec requirements. Thanks david jencks ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=376685&aid=585632&group_id=22866 ------------------------------------------------------- This sf.net email is sponsored by:ThinkGeek Welcome to geek heaven. http://thinkgeek.com/sf _______________________________________________ Jboss-development mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/jboss-development
