Hey all -- I am working on using user managed distrubuted transactions from flow. I have Cocoon 2.1, Tomcat 4.1.27, JOTM 1.4.3, and the JSQLConnect JDBC driver. I believe I have it working and would like to share some things and ask a question.
The biggest problem I had was the scenario when I started a transaction from flow and there was an unhandled exception, and the transaction was not cleaned up. When this happened, the next request would return a "Nested transactions not supported" exception. I suspect that this is because Tomcat (or Cocoon) has a thread pool servicing the requests, and since I did not clean up the transaction when the exception was thrown, the transaction remained active and bound to one of the threads in the pool. Therefore, the next request that reuses this thread and tries to start its own transaction will get the "Nested transactions not supported" exception. To help solve this problem, I created a small TransactionHelper JavaScript class that keeps track of the current connection(s) and transacion and has a cleanup() method that I call from a finally block. This method will attempt to rollback the active transaction and close any open connections. This seems to work, however, I wonder if there is a better place for this code? Who should be responsible for making sure there are no active transactions on threads in the thread pool? When I start a transaction, I could store a reference to the transaction using ThreadLocal, and somewhere right before the thread is returned to the pool, this could be checked and cleaned up (and an exception thrown) before the thread is returnd to the pool. Where would be an appropriate place in Cocoon to add this code? cheers, -steve