spring框架提供了两种编程式事务管理方式:
- 使用TransactionTemplate
- 直接使用PlatformTransactionManager实现
1、TransactionTemplate
TransactionTemplate采用与其他spring模板相同的方法,它使用一种回调方法,使应用程序代码可以处理获取和释放事务资源,让开发人员更加专注于业务逻辑。
public class SimpleService implements Service {
private final TransactionTemplate transactionTemplate;
public SimpleService(PlatformTransactionManager manager) {
Assert.notNull(manager,"the 'manager' argument must not be null");
this.transactionTemplate = new TransactionTemplate(manager);
}
public Object method1() {
return transactionTemplate.execute(new TransactionCallback() {
public Object doInTransaction(TransactionStatus status) {
updateOper1();
return updateOper2();
}
});
}
}
<bean id="sharedTransactionTemplate"
class="org.springframework.transaction.support.TransactionTemplate">
<property name="isolationLevelName" value="ISOLATION_READ_UNCOMMITTED"/>
<property name="timeout" value="30"/>
</bean>
2、PlatformTransactionManager
也可以直接使用org.springframework.transaction.PlatformTransactionManager来管理事务,只需通过bean引用将正在使用的PlatformTransactionManager的实现传递给bean。然后使用TransactionDefinition和TransactionStatus对象来启动、回滚和提交事务。
DefaultTransactionDefinition dtf = new DefaultTransactionDefinition();
dtf.setName("txName");
dtf.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = txManager.getTransaction(dtf);
try {
//...
} catch(MyException ex) {
txManager.rollback(status);
throw ex;
}
txManager.commit(status);
如果应用中只有很少量的事务操作,编程式事务管理通常是很好的选择。如果应用程序有大量的事务操作,则声明式事务管理通常是最优选择。它使事务不受业务逻辑的影响,并且在配置上也很简单。
spring4.2开始,事件的监听器可以被绑定到事务的某个阶段。注册常规的事件监听器是通过@EventListener注解完成的。如果要将其绑定到特定的事务中,可以使用@TransactionEventListener注解。当这样做时,默认情况下,监听器将被绑定到事务的提交阶段。
@Component
public class MyComponent {
@TransactionEventListener
public void handleOrderCreatedEvent(CreationEvent<Order> creationEvent) {
//...
}
}
@TransactionEventListener注解公开了一个阶段属性,允许自定义监听器绑定到事务的某个阶段,包括BEFORE_COMMIT 、AFTER_COMMIT(默认)、AFTER_ROLLBACK、AFTER_COMPLETION。
如果没有事务正在运行,则不会调用监听器。可以通过将注解的fallbackExecution属性设置为true来覆盖该行为。
--参考文献《Srping5开发大全》
网友评论