spring事务之注解形式(二)

说明

前一篇文字《spring事务之注解形式(一)》发现只是测试了情况,并且异常时属于RunTimeException的,所以造成我以为加了这个“@Transactional(readOnly = false, propagation = Propagation.REQUIRED”,就以为所有的都会回滚,但是我们得代码里面不一样,代码里面是自定义了异常,并且这个异常集成Exception的,所以经过测试,如果是这样是不会回滚的,最后网上搜了看看,并结合实际测试,还是有点理解,所以这篇属于经验之谈,哈哈,最后要弄清源码层次的。

一:抛出Exception异常,情况如下

@Transactional(readOnly = false, propagation = Propagation.REQUIRED,rollbackFor=Exception.class)
    public void testException(ParamBean pb) throws Exception {
        personInfoSerivice.updateLoginNameException(pb);
    }
@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
    public int updateLoginNameException(ParamBean pb) throws Exception {
        Map<String, Object> paramMap = pb.getParamMap();
        int i = personInfoMapper.updateLoginName(paramMap);
        try{
            System.out.println(10/0);
        }catch(Exception e){
            throw new Exception();
        }
        return i;
    }

1.如果不加rollbackFor=Exception.class,那么此次更新将不会回滚;如果加上则会进行回滚操作。
2.1.如果加rollbackFor=Exception.class,此次更新则会进行回滚操作。

    @Transactional(readOnly = false, propagation = Propagation.REQUIRED,rollbackFor=Exception.class)
    public void testExceptionForTwo(ParamMap pb) throws Exception {
        System.out.println("---------------------");
                personInfoSerivice.updatePerson(pb);
        personInfoSerivice.updateLoginNameException(pb);
    }
    
    
    @Transactional(readOnly = false, propagation = Propagation.REQUIRED,rollbackFor=Exception.class)
    public int updateLoginNameException(ParamMap pb) throws Exception {
        Map<String, Object> paramMap = pb.getParanMap();
        int i = personInfoMapper.updateLoginName(headMap);
        try{
            System.out.println(10/0);
        }catch(Exception e){
            e.printStackTrace();
            throw new Exception();
        }
        return i;
    }
    
    @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW,,rollbackFor=Exception.class)
    public int updatePerson(EngineBean pb) {
        Map<String, Object> headMap = pb.getHeadMap();
        headMap.put("mobile", "86"+headMap.get("mobileNo"));
        int i = personInfoMapper.updatePerson(headMap);
        return i;
    }

1.1如上代码结果:
如果两个都是一个是REQUIRES_NEW,updatePerson会执行成功,但是updateLoginNameException会进行回滚操作;
分析:因为updatePerson中没有异常抛出,并且是一个新的事物,所以在updateLoginNameException中抛出异常也不会影响到updatePerson的回滚。所以如果updateLoginNameException中try...catch没有抛出异常,则其也会执行成功。
1.2对于上述代码其存在的情况:

1:判断是否是同一个事物;
2:判断是否有try...catch异常,try完有没有抛出异常;如果捕获了异常,但是没有抛出异常,相当于该方法中没有异常;如果捕获到了异常,但是抛出了异常,那么就需要进行异常回滚。

二:抛出RunTimeException默认会回滚

比如之前抛出的10/0的异常:
java.lang.ArithmeticException: / by zero属于运行时异常
对之前的一篇文章中<a href="http://www.jianshu.com/p/a4137cf46e65">spring事务之注解形式(一)</a>,抛出的都是运行时异常,对于运行时异常,加了事物注解,spring会默认进行回滚操作.spring文档中有说明如下:

Transaction_Image.png

看RunTimeException那段意思是:
Spring框架的事务基础架构代码将默认地 在抛出运行时和unchecked exceptions时才标识事务回滚。 也就是说,当抛出一个 RuntimeException
或其子类例的实例时。(Errors
也一样 - 默认地 - 标识事务回滚。)从事务方法中抛出的Checked exceptions将 被标识进行事务回滚。

异常

Exception_Image.png

异常其实分unchecked exceptionschecked exceptions,我们主要关注unchecked的异常,对于unchecked的异常又分"运行时异常"和“非运行时异常”,网上看见了一片文章觉得很赞,<a href="http://blog.csdn.net/hguisu/article/details/6155636">深入理解java异常处理机制</a>;先借鉴下,后面看看自己也总结下自己的理解,哈哈。

NEXT

昨天下班后跟今天早上来公司加班,又专门的来测试了几种情况,主要还是要看上面所说的,是否是同一个事物,有没有进行异常捕获,捕获后有没有抛出都会影响事物的回滚等。之前也是一直都只是会用,使用xml形式的方式,这次使用注解,才有点深入的理解了些,但是还不够,底层的源码部分还是没有理解,现在只是理解了注解形式的配置而已,所以下面还有深入的分析,希望自己能搞定这种源码理解,最后,你会发现,只有自己尝试做过,遇到的东西才会理解的更深刻。

浩语

                                                       __                                                        
                                         __  _  ____ __|  |__ _____    ___
                                         \ \/ \/ /  |  \  |  \\__  \  /  _ \   
                                          \     /|  |  /   Y  \/ __ \(  <_> )
                                           \/\_/ |____/|___|  (____  /\____/ 
                                                            \/     \/          
                              走在自己的路上,遇到要遇到的人,经历要经历的事,这才是我们需要面对的。
                                                       
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容