我有一个使用spring @Transactional
和另一个自定义注释@Counter
注释的方法。来自不同类的许多其他方法使用@counter
。
@Transactional
@Counter
public int myMethod() {
....
}
@Counter
被一个方面拦截,该方面执行一些与计数相关的逻辑并保存到数据库并标记为@Transactional
,因此在与myMethod()
不同的事务中完成。
当我调用此myMethod()
时,首先调用此方面,然后在完成后创建myMethod()
的事务,然后在myMethod()
中执行业务逻辑。
这里的问题是,如果在myMethod()
中抛出任何异常,它会回滚所有更改。但由于@Counter处于不同的事务中,它仍在处理和执行与计数器相关的更新,并且不会回滚与计数器相关的更改。
我的问题是:是否有可能将@Counter
的方面也置于myMethod()
的同一转换范围内?是否可以在调用myMethod()
之前为@Counter
创建交易?
编辑1:我已尝试使用@Order
(值5)表示周围方面,并且myMethod()
交易顺序将从上下文xml推断
<tx:annotation-driven transaction-manager="transactionManager" order = "1"/>
只有在方面完成后才会创建仍然事务
编辑2:
@Aspect
public class CounterHandler {
@Autowired
private counterOperation CounterOperation;
@Around("@annotation(com.prime.monitor.counter.aspect.Counter)")
public Object aroundAdvice(final ProceedingJoinPoint methodInvocation) {
//counter related operation
return counterOperation.prepareCounter(methodInvocation);
}
}