[infinispan-issues] [JBoss JIRA] Created: (ISPN-604) Re-design CacheStore transactions

Mircea Markus (JIRA) jira-events at lists.jboss.org
Mon Aug 16 07:42:11 EDT 2010


Re-design CacheStore transactions 
----------------------------------

                 Key: ISPN-604
                 URL: https://jira.jboss.org/browse/ISPN-604
             Project: Infinispan
          Issue Type: Feature Request
          Components: Loaders and Stores, Transactions
    Affects Versions: 4.1.0.CR2, 4.0.0.Final
            Reporter: Mircea Markus
            Assignee: Mircea Markus
             Fix For: 5.0.0.Final


Current(4.1.x) transaction implementation in CacheStores is brocken in several ways:
1st problem.
- AbstractCacheStore.prepare:
   public void prepare(List<? extends Modification> mods, GlobalTransaction tx, boolean isOnePhase) throws CacheLoaderException {
      if (isOnePhase) {
         applyModifications(mods);
      } else {
         transactions.put(tx, mods);
      }
   }
If this is 1PC we apply the modifications in the prepare phase - we should do it in the commit phase (as JTA does it).
2nd problem.
This currently exhibits during commit/rollback with JdbcXyzCacheStore, but it is rather a more general cache store issue.
When using a TransactionManager, during TM.commit AbstractCacheStore.commit is being called internally which tries to apply all the modifications that happened during that transaction.
Within the scope of AbstractCacheStore.commit, JdbcStore obtains a connection from a DataSource and tries to write the modifications on that connection.
Now if the DataSource is managed (e.g. by an A.S.) on the DS.getConnection call the A.S. would try to enlist the connection with the ongoing transaction by calling Transaction.enlistResource(XAResource xaRes) [1]
This method fails with an IllegalStateException, because the transaction's status is preparing (see javax.transaction.Transaction.enlistResource).
Suggested fix:
- the modifications should be registered to the transaction as they happen(vs. during prepare/commit as it happens now)
- this requires API changes in CacheStore, e.g. 
void store(InternalCacheEntry entry) 
should become 
void store(InternalCacheEntry entry, GlobalTransaction gtx)
(gtx would be null if this is not a transactional call).

[1] This behavior is specified by the JDBC 2.0 Standard Extension API, chapter 7 - distributed transaction 


-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the infinispan-issues mailing list