[
https://issues.apache.org/jira/browse/DERBY-4731?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Mike Matrigali updated DERBY-4731:
----------------------------------
I verified the bug is reproducible against trunk using the attached test case.
The stores support of XA enforces certain protocols. After a transaction has
been prepared, no further activity on that transaction is expected. The raw
store enforces this by checking the state of the transaction for all logged
operations. It will throw a protocol error if any logged operation is
attempted
after the transaction has moved into PREPARE state. This is the situation that
the test case is
causing.
In this case the global temporary table has been declared to not be logged and
on commit to delete all the rows in the table. It looks like the code to do
this did not take into account XA transactions. To
provide the expected behavior with no logging, the SQL layer determines at
commit time if any
temp tables will need fix up, and in the case of delete on commit it implements
this by creating new
empty containers and substituting these for the existing containers. This
action of creating a container
after the prepare is caught by store and the error is thrown.
I am not sure the right fix, but here are some options:
1) somehow figure out how to move the work to prepare, rather than commit - so
that there is no
work to do at commit time.
2) move the work to after the commit. I think this will mean coming up with a
different transaction
to do the work on. Need to make sure all the work is done before user gets
control back.
option 2 seems best to me, not sure how tricky it is to come up with the right
transaction to use.
> XA two phase commit with active GLOBAL TEMPORARY TABLE causes An internal
> error identified by RawStore module
> ---------------------------------------------------------------------------------------------------------------
>
> Key: DERBY-4731
> URL: https://issues.apache.org/jira/browse/DERBY-4731
> Project: Derby
> Issue Type: Bug
> Components: JDBC
> Affects Versions: 10.3.3.0, 10.4.2.0, 10.5.3.0, 10.6.1.0, 10.7.0.0
> Reporter: Kathey Marsden
> Attachments: ReproXATempTable.java, utilXid.java
>
>
> If an XA two phase commit is performed while an GLOBAL TEMPORARY TABLE is
> active, it will fail with:
> XAER_RMERR
> Exception in thread "main" javax.transaction.xa.XAException: An internal
> error w
> as identified by RawStore module.
> at
> org.apache.derby.jdbc.EmbedXAResource.wrapInXAException(EmbedXAResour
> ce.java:820)
> at
> org.apache.derby.jdbc.EmbedXAResource.commit(EmbedXAResource.java:143
> )
> at ReproXATempTable.tempTableInXA(ReproXATempTable.java:51)
> at ReproXATempTable.main(ReproXATempTable.java:14)
> Caused by: java.sql.SQLTransactionRollbackException: An internal error was
> ident
> ified by RawStore module.
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(SQLE
> xceptionFactory40.java:88)
> at
> org.apache.derby.impl.jdbc.Util.generateCsSQLException(Util.java:256)
> at
> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException
> (TransactionResourceImpl.java:391)
> at
> org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Tr
> ansactionResourceImpl.java:346)
> at
> org.apache.derby.impl.jdbc.EmbedConnection.handleException(EmbedConne
> ction.java:2269)
> at
> org.apache.derby.impl.jdbc.EmbedConnection.xa_commit(EmbedConnection.
> java:2924)
> at
> org.apache.derby.jdbc.XATransactionState.xa_commit(XATransactionState
> .java:339)
> at
> org.apache.derby.jdbc.EmbedXAResource.commit(EmbedXAResource.java:141
> )
> ... 2 more
> Caused by: java.sql.SQLException: An internal error was identified by
> RawStore m
> odule.
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(SQLExc
> eptionFactory.java:45)
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransport
> AcrossDRDA(SQLExceptionFactory40.java:119)
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(SQLE
> xceptionFactory40.java:70)
> ... 9 more
> Caused by: ERROR 40XT0: An internal error was identified by RawStore module.
> at
> org.apache.derby.iapi.error.StandardException.newException(StandardEx
> ception.java:276)
> at
> org.apache.derby.impl.store.raw.xact.Xact.setActiveState(Xact.java:18
> 09)
> at
> org.apache.derby.impl.store.raw.xact.Xact.addContainer(Xact.java:1357
> )
> at org.apache.derby.impl.store.access.heap.Heap.create(Heap.java:274)
> at
> org.apache.derby.impl.store.access.heap.HeapConglomerateFactory.creat
> eConglomerate(HeapConglomerateFactory.java:195)
> at
> org.apache.derby.impl.store.access.RAMTransaction.createConglomerate(
> RAMTransaction.java:823)
> at
> org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.clean
> upTempTableOnCommitOrRollback(GenericLanguageConnectionContext.java:1345)
> at
> org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.doCom
> mit(GenericLanguageConnectionContext.java:1263)
> at
> org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.xaCom
> mit(GenericLanguageConnectionContext.java:1160)
> at
> org.apache.derby.impl.jdbc.EmbedConnection.xa_commit(EmbedConnection.
> java:2921)
> ... 4 more
> See attached program for reproduction.
> javac -g ReproXATempTable.java utilXid.java
> java ReproXATempTable
> To work around the issue, you can drop the temp table before ending the xa
> transaction.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.