一次想不到的Spring事务失效问题跟踪(事务不会滚)

本文探讨了Spring事务管理的实际应用,包括如何配置事务、常见的问题及其解决办法。通过一个具体的示例,展示了如何处理异常并确保事务正确回滚。

周末,鼓捣了下spring事务。spring事务配置其实很简单,这是spring优点。但问题是,不知道其中原理,遇到点问题,就抓瞎了。我就犯傻了一次。

在追踪问题时,搜索到的答案,主要有以下几类。

  1. springmvc 上下文,与service上下文冲突

  2. 数据表不支持事务(mysql 中myisam)

  3. 异常类型,默认支持RuntimeException,如果是其他异常则需要专门配置

我的问题,上面原因都不是。很遗憾。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Transactional(isolation= Isolation.READ_COMMITTED, rollbackFor={Exception.class, RuntimeException.class})
public int saveBlog(Blog blog) {
       int blogId=0;
    try {
        blogId = this.blogDao.save(blog);
        Event event = new Event();
        event.setEventDate(new Date());
        String eventStr= MessageFormat.format("this is a event from blog {0}", blogId);
        event.setTitle(eventStr);
        if(blog.getTitle().contains("error")){
            throw new Exception("模拟失败情况,手动触发异常");
        }
        this.eventDao.save(event);
    finally {
        return blogId;
    }
}


我为了方便测试结果验证,强制返回ID.使用了finally.

跟踪日志过程中,发现,异常信息不打印,被忽略了。非常奇怪。把finally去掉,就正常打印异常堆栈。

修复方式是很显然把try finally结构去掉。




本文转自 randy_shandong 51CTO博客,原文链接:http://blog.51cto.com/dba10g/1923434,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值