package com.acme.transaction; import javax.transaction.UserTransaction; public abstract class TransactionWorker { public abstract Object doWork() throws Exception; public Object workInTransaction(UserTransaction tx) throws Exception { Object result = null; System.out.println("Beginning transaction"); tx.begin(); try { result = doWork(); System.out.println("Committing transaction"); tx.commit(); } catch (Exception e) { System.out.println("Rolling back transaction"); tx.rollback(); } return result; } }