Spring提供两种方式的编程式事务管理:
使用 TransactionTemplate
直接使用一个 PlatformTransactionManager
实现
如果你选择编程式事务管理,Spring小组推荐你采用第一种方法(即使用 TransactionTemplate
)。第二种方法类似使用JTA的 UserTransaction
API (除了异常处理简单点儿)。
TransactionTemplate
采用与Spring中别的 模板 同样的方法,如 JdbcTemplate
和 HibernateTemplate
。它使用回调机制,将应用代码从样板式的资源获取和释放代码中解放出来,不再有大量的try/catch/finally/try/catch代码块。同样,和别的模板类一样,TransactionTemplate
类的实例是线程安全的。
必须在事务上下文中执行的应用代码看起来像这样:(注意使用 TransactionCallback
可以有返回值)
Object result = tt.execute(new TransactionCallback() { public Object doInTransaction(TransactionStatus status) { updateOperation1(); return resultOfUpdateOperation2(); } });
如果不需要返回值,更方便的方式是创建一个 TransactionCallbackWithoutResult
的匿名类,如下:
tt.execute(new TransactionCallbackWithoutResult() { protected void doInTransactionWithoutResult(TransactionStatus status) { updateOperation1(); updateOperation2(); } });
回调方法内的代码可以通过调用 TransactionStatus
对象的 setRollbackOnly()
方法来回滚事务。
想要使用 TransactionTemplate
的应用类必须能访问一个 PlatformTransactionManager
(典型情况下通过依赖注入提供)。这样的类很容易做单元测试,只需要引入一个 PlatformTransactionManager
的伪类或桩类。这里没有JNDI查找、没有 静态
诡计,它是一个如此简单的接口。像往常一样,使用Spring给你的单元测试带来极大地简化。
你也可以直接使用 org.springframework.transaction.PlatformTransactionManager
的实现来管理事务。只需通过bean引用简单地传入一个 PlatformTransactionManager
实现,然后使用 TransactionDefinition
和 TransactionStatus
对象,你就可以启动一个事务,提交或回滚。
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = txManager.getTransaction(def);
try {
// execute your business logic here
}
catch (MyException ex) {
txManager.rollback(status);
throw ex;
}
txManager.commit(status);