@Transactional失效場景及其原理分析

1.數據庫引擎是否支持事務(Mysql的MyIsam引擎就不支持事務)

2.註解所在的類是否注入spring容器中

3.註解所在方法是否爲public修飾或者final(方法實現了接口是否爲public,方法沒有實現接口是否爲final)

分析:這是由 Spring AOP 的本質決定的。如果你在 protected、private 或者默認可見性的方法上使用 @Transactional 註解,這將被忽略,也不會拋出任何異常。

          @Transactional的實現是基於動態代理的,private和final修飾的方法,不會被代理。

          個人觀點:在spring中動態代理分爲jdk動態代理和cglib動態代理,jdk動態代理要求必須實現接口(所以方法必須是public的),但是cglib動態代理底層則是通過字節碼生成被代理類的子類來實現的,這裏要求被代理類必須能被繼承(所以方法不能被final修飾--final可以限制類被繼承)並且方法也只能是public,其他的權限修飾符在繼承時訪問權限會發生變化,例如protected的,在父類中爲public,在子類中就爲protected了。

 

4.所用數據源是否加載了事務管理器

5.是否發生了方法的自調用(同一個類中的A方法調用B方法)

分析:若同一類中的其他沒有@Transactional 註解的方法內部調用有@Transactional 註解的方法,有@Transactional 註解的方法的事務被忽略,不會發生回滾。

 

6.當方法發生異常時,使用try catch捕獲了異常,並且catch中沒有拋出異常或者手動回滾。

分析:事務的回滾是方法發生異常,在aop的異常通知中進行攔截,回滾,如果方法中捕獲了異常,是不會被aop的異常通知攔截到的。

      如果使用了try catch捕獲異常,需要在catch中拋出一個異常或者在catch中通過

 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()  設置手動回滾。
                                </div>
                                <div class="more-toolbox">
            <div class="left-toolbox">
                <ul class="toolbox-list">
                    
                    <li class="tool-item tool-active is-like  tool-clicked"><a href="javascript:;"><svg class="icon" aria-hidden="true">
                        <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#csdnc-thumbsup"></use>
                    </svg><span class="name">點贊</span>
                    <span class="count">2</span>
                    </a></li>
                    <li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{&quot;mod&quot;:&quot;popu_824&quot;}"><svg class="icon" aria-hidden="true">
                        <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-csdnc-Collection-G"></use>
                    </svg><span class="name">收藏</span></a></li>
                    <li class="tool-item tool-active is-share"><a href="javascript:;"><svg class="icon" aria-hidden="true">
                        <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-csdnc-fenxiang"></use>
                    </svg>分享</a></li>
                    <!--打賞開始-->
                                            <!--打賞結束-->
                                            <li class="tool-item tool-more">
                        <a>
                        <svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg>
                        </a>
                        <ul class="more-box">
                            <li class="item"><a class="article-report">文章舉報</a></li>
                        </ul>
                    </li>
                                        </ul>
            </div>
                        </div>
        <div class="person-messagebox">
            <div class="left-message"><a href="https://blog.csdn.net/qq_34707456">
                <img src="https://profile.csdnimg.cn/D/8/3/3_qq_34707456" class="avatar_pic" username="qq_34707456">
                                        <img src="https://g.csdnimg.cn/static/user-reg-year/1x/4.png" class="user-years">
                                </a></div>
            <div class="middle-message">
                                    <div class="title"><span class="tit"><a href="https://blog.csdn.net/qq_34707456" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}" target="_blank">風起塵落</a></span>
                                        </div>
                <div class="text"><span>發佈了61 篇原創文章</span> · <span>獲贊 74</span> · <span>訪問量 5572</span></div>
            </div>
                            <div class="right-message">
                                        <a href="https://im.csdn.net/im/main.html?userName=qq_34707456" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-letter">私信
                    </a>
                                                        <a class="btn btn-sm  bt-button personal-watch" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}">關注</a>
                                </div>
                        </div>
                </div>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章