Programmatic Transaction Demarcation
你可以在应用程序的更高层次上划分事务,在跨越任何数量的操作的低层次数据访问服务之上。对周围业务服务的实现也不存在限制。它只需要一个 Spring PlatformTransactionManager。同样,后者可以来自任何地方,但最好是通过 setTransactionManager(..)
方法作为一个 bean 引用。另外,productDAO 应该通过 setProductDao(..)
方法来设置。下面一对片段展示了 Spring 应用程序上下文中的事务管理器和业务服务定义,以及一个业务方法实现的例子:
<beans>
<bean id="myTxManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="mySessionFactory"/>
</bean>
<bean id="myProductService" class="product.ProductServiceImpl">
<property name="transactionManager" ref="myTxManager"/>
<property name="productDao" ref="myProductDao"/>
</bean>
</beans>
public class ProductServiceImpl implements ProductService {
private TransactionTemplate transactionTemplate;
private ProductDao productDao;
public void setTransactionManager(PlatformTransactionManager transactionManager) {
this.transactionTemplate = new TransactionTemplate(transactionManager);
}
public void setProductDao(ProductDao productDao) {
this.productDao = productDao;
}
public void increasePriceOfAllProductsInCategory(final String category) {
this.transactionTemplate.execute(new TransactionCallbackWithoutResult() {
public void doInTransactionWithoutResult(TransactionStatus status) {
// 这是在事务回调函数里面调用的 dao
List productsToChange = this.productDao.loadProductsByCategory(category);
// do the price increase...
}
});
}
}
Spring 的 TransactionInterceptor 允许任何被检查的应用程序异常与回调代码一起被抛出,而 TransactionTemplate 则被限制在回调中的未被检查的异常。TransactionTemplate 在出现未检查的应用程序异常或事务被应用程序标记为只回滚的情况下(通过设置 TransactionStatus),会触发回滚。默认情况下,TransactionInterceptor 的行为与此相同,但允许每个方法的可配置回滚策略。