10.7.编程式事务管理
10.7. 编程式事务管理
Spring提供两种方式的编程式事务管理:
使用
TransactionTemplate
直接使用一个
PlatformTransactionManager
实现
如果你选择编程式事务管理,Spring小组推荐你采用第一种方法(即使用TransactionTemplate
)。第二种方法类似使用JTA的UserTransaction
API (除了异常处理简单点儿)。
10.7.1. 使用 TransactionTemplate
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给你的单元测试带来极大地简化。
10.7.2. 使用 PlatformTransactionManager
你也可以直接使用 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);