iteye_2089 2011-11-08 15:31
浏览 248
已采纳

关于事务回滚的问题

我在项目中使用是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条回答

  • fmjsjx 2011-11-08 17:08
    关注

    [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]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 数据库数据成问号了,前台查询正常,数据库查询是?号
  • ¥15 算法使用了tf-idf,用手肘图确定k值确定不了,第四轮廓系数又太小才有0.006088746097507285,如何解决?(相关搜索:数据处理)
  • ¥15 彩灯控制电路,会的加我QQ1482956179
  • ¥200 相机拍直接转存到电脑上 立拍立穿无线局域网传
  • ¥15 (关键词-电路设计)
  • ¥15 如何解决MIPS计算是否溢出
  • ¥15 vue中我代理了iframe,iframe却走的是路由,没有显示该显示的网站,这个该如何处理
  • ¥15 操作系统相关算法中while();的含义
  • ¥15 CNVcaller安装后无法找到文件
  • ¥15 visual studio2022中文乱码无法解决