在方面内进行交易

时间:2014-11-27 13:22:49

标签: java spring transactions aspectj

我对方法有一个方面,由@Around注释,其中有以下几行:

@Around("@annotation(CustomAnnotation)")
public void handle(ProceedingJoinPoint joinPoint) {
    MethodSignature ms = (MethodSignature) joinPoint.getSignature();
    CustomAnnotation m = ms.getMethod().getAnnotation(CustomAnnotation.class);
    Processor processor = appContext.getBean(m.value());
    Object argument = joinPoint.getArgs()[0]; 

    processor.preProcess(argument);
    joinPoint.proceed();
    processor.postProcess(argument);
}

被Aspect中断的方法:

@CustomAnnotation(value = "CreateProcessor")
public void create(User user) {
    createOrUpdate(user); //in this method user in "Users" is created or updated
}

Processor.preProcess()为空。

Processor.postProcess():

@Override
public void postProcess(Object obj) {
    //add obj to "Objects" table in DB
}

所有这些方法(preProcess,postProcess,proceed)都与不同的数据库表进行交互。所以我想用这3个方法调用进行一个事务,即当其中一个没有成功执行时,应该还原之前的那些更改。我怎样才能实现目标?

UPD。 我已经尝试了接下来的步骤:

在我的上下文文件中添加了以下行:

<tx:annotation-driven transaction-manager="txManager"/>

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

在我的handle()方法中添加了@Transactional注释。

要检查是否执行了回滚,我添加了异常抛出:

@Override
public void postProcess(Object obj) {
    throw new RuntimeException("TEST");
    //add obj to "Objects" table in DB
}

虽然抛出异常且“对象”表中没有新行,但“用户”中会出现新行。

0 个答案:

没有答案