1 Reply Latest reply on Mar 14, 2011 2:21 PM by mmusgrov

    XA Transaction propagation within many threads

    dro_k

      Hi Everyone,

       

      How can I use JBoss TS in the following use case:

       

      Let's assume we have the following class:

       

      public class Dao {

          public void updateDatabase(DB db) {

              connet to db

              run a sql

          }

      }

       

      and we create a Java Runnable from that, like the following:

       

      public class MyRunnable extends Runnable {

       

          Dao dao;

          DB db;

       

          public MyRunnable(Dao dao, DB db) {

              this.dao=dao;

              this.db = db;

          }           

       

          public run() throws Exception {

              return dao.updateDatabase(db);

          }

      }

       

      Now in our Service layer, we have another class:

       

      public class Service {

          public void updateDatabases() {

              BEGIN TRANSACTION;

       

              ExecutorService es = Executors.newFixedThreadPool(10);

              ExecutorCompletionService ecs = new ExecutorCompletionService(es);

              List<Future<T>> futures = new ArrayList<Future<T>>(n);

              Dao dao = new Dao();

              futures.add(ecs.submit(new MyRunnable(dao, new DB("db1")));

              futures.add(ecs.submit(new MyRunnable(dao, new DB("db2")));

              futures.add(ecs.submit(new MyRunnable(dao, new DB("db3")));

       

              for (int i = 0; i < n; ++i) {

              completionService.take().get();

              }

       

             END TRANSACTION;

          }

       

      }

       

      And the client can be a Servlet or any other multi-threaded environment:

       

      public MyServlet extend HttpServlet {

          protected void service(final HttpServletRequest request, final HttpServletResponse response) throws IOException {

              Service service = new Service();

              service.updateDatabases();

          }

      }

       

      What would be the correct code for BEGIN TRANSACTION and END TRANSACTION parts? Is this even feasible? If not, what needs to be changed? The requirements is to keep the updateDatabases() method concurrent (since it will be accessing multiple databases at the same time) and transactional.

       

      Thanks,

       

      Drew

        • 1. XA Transaction propagation within many threads
          mmusgrov

          I haven't tried this out myself but it sounds like you need to manage transaction association and enlistment of the database resources yourself from each thread. For example:

           

            TransactionManager txnManager = lookup the transaction manager (eg via jndi)

            Transaction txn = txnManager.getTransaction()

            XADataSource xaDataSource1 = lookup data source for db1

            XAConnection xaConnection1 = xaDataSource1.getXAConnection()

            XAResource xaResource1 = xaConnection1.getXAResource()

           

          and similarly for db2 and db3

           

          and in each thread:

            txnManager.resume(txn);

            txn.enlistResource(xaResource1)

            and similarly for the other two resources