正常开发,我们一般会使用基于事务的注解来实现事务的机制,但是有的时候或者某种场景,完全通过注解是达不到效果的,比如 我们想完成以下的场景:
1 根据条件,手动回滚或者提交事务
2 获取事务是否已经彻底完成的状态
3 设置事务具体的回滚point等,一句话想更好灵活的去控制事务的使用,这个时候推荐自定义事务的实现,一般通过如下两种方式
3.1 基于TransactionTemplate
使用TransactionTemplate 不需要显式地开始事务,甚至不需要显式地提交事务。这些步骤都由模板完成。但出现异常时,应通过TransactionStatus 的setRollbackOnly 显式回滚事务。
TransactionTemplate 的execute 方法接收一个TransactionCallback 实例。Callback 也是Spring 的经典设计,用于简化用户操作, TransactionCallback 包含如下方法。
• Object dolnTransaction(TransactionStatus status) 。
一般使用如下所示的代码结构
transactionTemplate.execute(new TransactionCallback() {
public Object doInTransaction(TransactionStatus status) {
try{
}
catch (Exception e) {
}
finally {
status.setRollbackOnly();
)
);
这个方法是可以由返回只
如果有异常的话,一定要使用status.setRollbackOnly进行回滚
3.2 基于PlatformTransactionManager
使用PlatformTransactionManager直接管理事务。简单地通过一个bean引用给你的bean传递一个你使用的 PlatformTransaction对象。然后,使用TransactionDefinition和TransactionStatus对象就可以发起、回滚、提交事务。它会涉及到其它两个对象TransactionDefinition和TransactionStatus,一般使用如下片段
//定义一个事务
DefaultTransactionDefinition def= new DefaultTransactionDefinition();
//设置事务的传播级别
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
//获取事务的状态
TransactionStatus status = transactionManager.getTransaction(def);
//提交事务;
transactionManager.commit(status);
//回滚事务
transactionManager.rollback(status);