关于事务回滚的问题

我在项目中使用是aop的方式配置事务管理,但是我在serviceImpl中的一个方法中同时调用多个dao中的insert方法,第一个dao的操作成功,第二个dao的操作失败,但是事务为什么没回滚呢?

配置代码:
[code="java"]

<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
    p:dataSource-ref="dataSource">
</bean>
<!-- 以AspectJ方式 定义 AOP -->
<aop:config proxy-target-class="true">
    <aop:advisor pointcut="execution(* com.*.service.impl.*ServiceImpl.*(..))" advice-ref="txAdvice"/>
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRED"/>
    </tx:attributes>
</tx:advice>

[/code]

java代码:
[code="java"]
@Override
public Integer insert(Info info, String abilitys, String languages) {
Integer infoId = 0;
try {
String sessionId = SysUtil.getTimeStamp("yyyyMMddHHmmss")
+ SysUtil.getNumRandom(7);
info.setSessionId(sessionId);
info.setMi_dateTime(new Date());
info.setMi_status(1);
//String result = HttpUtils.applyAbility(info, abilitys);
//if (result.split(";")[0].equals("Result=0")) {
log.info("add info :" + info.toString());
infoId = infoDao.save(info);
log.info("add info return:" + infoId);
InfoAbility a = new InfoAbility();
InfoLanguage l = new InfoLanguage();

            String[] ability = abilitys.split(",");
            String[] language = languages.split(",");
            for (int i = 0; i < ability.length; i++) {
                a.setMia_miId(infoId);
                a.setMia_maId(Integer.parseInt(ability[i]));
                infoAbilityDao.save(a);
            }

            for (int i = 0; i < language.length; i++) {
                l.setMil_miId(infoId);
                l.setMil_mlId(Integer.parseInt(language[i]));
                infoLanguageDao.save(l);
            }
        //} else {
        //  log.info("info apply is failure!result:" + result);
        //}

    } catch (Exception e) {
        log.error("insert info is error:" + e);
        return 0;
    }

    return infoId;
}

[/code]

4个回答

[quote][code="java"]
...
} catch (Exception e) {

log.error("insert info is error:" + e);

return 0;

}

...
[/code][/quote]
问题就在这一段:
因为所有的Exception都被你catch住了,导致aop最终无法捕获到任何异常,于是就认为是正确执行没有错误,所以也就没有回滚而直接提交了。
比较好的方法是这样:
[code="java"]
...
} catch (RuntimeException e) {
log.error("insert info is error: " + e);
throw e;
}
...
[/code]

分布式事务?
又或是InfoAbility,InfoLanguage之间有关联关系?

在pointcut写上完整的 package 与 class 名称,
还有 tx:method name不要用 *
我认为infoAbilityDao.save 可能已被 aop 给 commit 了

我们的系统,分别使用JDBC,iBatis,Hibernate这三种数据库访问技术,使用编程方式手工管理数据库连接和事务,不使用Spring这样的IOC容器进行管理
有时间看看
http://blog.csdn.net/shendl/article/details/1415958
主要讲的是事务管理

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!