我有一个如下代码
public abstract class AffltTransactionService implements IAffltTransactionService {
....
@Override
@Transactional
public void processTransactions(List<? extends AffltTransaction> transactions) {
for (AffltTransaction transaction : transactions) {
if (transaction != null) {
processTransaction(transaction);
}
}
}
private void processTransaction(AffltTransaction transaction) {
try {
processTransactionInternal(transaction);
} catch (Exception exception) {
affltTransactionError = new AffltTransactionError(null, null, "error", new Date());
saveAffltTransactionError(affltTransactionError);
log.error(exception.getLocalizedMessage());
}
}
@Transactional(readOnly=false, rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
public void processTransactionInternal(AffltTransaction transaction) {
processTransactionInternal抛出ServiceUnAvailableException,它扩展了RuntimeException
但是,尽管有rollbackFor = Exception.class,但事务并没有回滚。 你能帮忙吗?
答案 0 :(得分:6)
@Transactional
注释将不会产生任何影响,因为Spring在注释类上方创建代理,而方面定义的功能由代理实现。因此,当您从类中调用该方法时,它无法通过代理,因此不会创建和/或回滚转换。
请查看Spring reference以获取详细说明。
答案 1 :(得分:2)
由于您在同一个bean中调用另一个方法,因此Spring AOP在这种情况下不使用任何建议。
processTransactions
仅包含TransactionInteceptor
。
要使其有效,您应该配置:
<aop:aspectj-autoproxy expose-proxy="true"/>
但它并没有被推荐。
此处有更多信息:http://www.intertech.com/Blog/secrets-of-the-spring-aop-proxy
答案 2 :(得分:1)
使用getCurrentSession而不是opensession
答案 3 :(得分:0)
您使用的方法@Transactional应该抛出异常。不要使用try-catch。(我猜你在processTransaction函数的某个地方使用了try-catch)。 代码应该是这样的:
@Transactional
public void processTransactions(List<? extends AffltTransaction> transactions) threws Exception{
for (AffltTransaction transaction : transactions) {
if (transaction != null) {
processTransaction(transaction);
}
}
}