Spring transaction mechanism supports:

  • programming transaction
  • declaring transaction

I. Programming transaction:

  1. At first, you should define a transactionManager which is the subclass derived from PlatformTransactionManager.
    1. DataSourceTransactionManager: inject datasource instance to it.
    2. JtaTransactionManager: no need to inject anything
    3. HibernateTransactionManager: inject sessionFactory instance to it
    4. JdoTransactionManager: inject persistenceManagerFactory instance to it
  2. Then, inject these transactionManagers to JdbcTemplate, HibernateTemplate, JdoTemplate, sqlMapDaoTemplate respectively. All these templates encapsulate transaction operations, so its handy to use them to do transactions. But you can also use transactionManagers directly.
public void enrollStudentInCourse() {
  transactionTemplate.execute(
    new TransactionCallback() {
      public Object doInTransaction(TransactionStatus ts) {
        try {
          // do stuff
        } catch (Exception e) {
          ts.setRollbackOnly();
        }
        return null;
      }
    }
  );
}

Do transaction without result:

transactionTemplate.execute(
    new TransactionCallbackWithoutResult() {
        public Object doInTransactionWithoutResult(TransactionStatus ts) {
            try {
                // do stuff
            } catch (Exception e) {
                ts.setRollbackOnly();
            }
        }
    }
);

Do transaction with PlatformTransactionManager subclass directly:

DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = transactionManager.getTransaction(def);

try {
  // do stuff
} catch (Exception e) {
  transactionManager.rollback(status);
}

transactionManager.commit(status);

II. We do not talk about Declaring Transaction here…