欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

spring事務失效的原因有哪些

這篇文章主要介紹“spring事務失效的原因有哪些”,在日常操作中,相信很多人在spring事務失效的原因有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”spring事務失效的原因有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

目前成都創(chuàng)新互聯(lián)已為1000多家的企業(yè)提供了網(wǎng)站建設、域名、網(wǎng)頁空間、網(wǎng)站托管、服務器租用、企業(yè)網(wǎng)站設計、沂水網(wǎng)站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

1.spring事務實現(xiàn)方式及原理

Spring 事務的本質其實就是數(shù)據(jù)庫對事務的支持,沒有數(shù)據(jù)庫的事務支持,spring 是無法提供事務功能的。真正的數(shù)據(jù)庫層的事務提交和回滾是在binlog提交之后進行提交的 通過 redo log 來重做, undo log來回滾。

一般我們在程序里面使用的都是在方法上面加@Transactional 注解,這種屬于聲明式事務。

聲明式事務本質是通過 AOP 功能,對方法前后進行攔截,將事務處理的功能編織到攔截的方法中,也就是在目標方法開始之前加入一個事務,在執(zhí)行完目標方法之后根據(jù)執(zhí)行情況提交或者回滾事務。

2.數(shù)據(jù)庫本身不支持事務

這里以 MySQL 為例,其 MyISAM 引擎是不支持事務操作的,InnoDB 才是支持事務的引擎,一般要支持事務都會使用 InnoDB

3.當前類的調用
@Service
public class UserServiceImpl implements UserService {

    public void update(User user) {
        updateUser(user);
    }
    
    @Transactional(rollbackFor = Exception.class)
    public void updateUser(User user) {
        // update user
    }
    
}

上面的這種情況下是不會有事務管理操作的。

通過看聲明式事務的原理可知,spring使用的是AOP切面的方式,本質上使用的是動態(tài)代理來達到事務管理的目的,當前類調用的方法上面加@Transactional 這個是沒有任何作用的,因為調用這個方法的是this.

OK, 我們在看下面的一種例子。

@Service
public class UserServiceImpl implements UserService {

    @Transactional(rollbackFor = Exception.class)
    public void update(User user) {
        updateUser(user);
    }
    
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void updateUser(User user) {
        // update user
    }
    
}

這次在 update 方法上加了 @Transactional,updateUser 加了 REQUIRES_NEW 新開啟一個事務,那么新開的事務管用么?

答案是:不管用!

因為它們發(fā)生了自身調用,就調該類自己的方法,而沒有經(jīng)過 Spring 的代理類,默認只有在外部調用事務才會生效,這也是老生常談的經(jīng)典問題了。

4.方法不是public的
@Service
public class UserServiceImpl implements UserService {

    @Transactional(rollbackFor = Exception.class)
    private void updateUser(User user) {
        // update user
    }
    
}

private 方法是不會被spring代理的,因此是不會有事務產生的,這種做法是無效的。

5.沒有被spring管理
//@Service
public class UserServiceImpl implements UserService {

    @Transactional(rollbackFor = Exception.class)
    public void updateUser(User user) {
        // update user
    }
    
}

沒有被spring管理的bean, spring連代理對象都無法生成,當然無效咯。

6.配置的事務傳播性有問題
@Service
public class UserServiceImpl implements UserService {

    @Transactional(propagation = Propagation.NOT_SUPPORTED)
    public void update(User user) {
        // update user
    }    
}

回顧一下spring的事務傳播行為

Spring 事務的傳播行為說的是,當多個事務同時存在的時候, Spring 如何處理這些事務的行為。

  1. PROPAGATION_REQUIRED:如果當前沒有事務,就創(chuàng)建一個新事務,如果當前存在事務,就加入該事務,該設置是最常用的設置。

  2. PROPAGATION_SUPPORTS:支持當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就以非事務執(zhí)行

  3. PROPAGATION_MANDATORY:支持當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就拋出異常。

  4. PROPAGATION_REQUIRES_NEW:創(chuàng)建新事務,無論當前存不存在事務,都創(chuàng)建新事務。

  5. PROPAGATION_NOT_SUPPORTED:以非事務方式執(zhí)行操作,如果當前存在事務,就把當前事務掛起。

  6. PROPAGATION_NEVER: 以非事務方式執(zhí)行,如果當前存在事務,則拋出異常。

  7. PROPAGATION_NESTED:如果當前存在事務,則在嵌套事務內執(zhí)行。如果當前沒有事務,則按 REQUIRED 屬性執(zhí)行

當傳播行為設置了PROPAGATION_NOT_SUPPORTED,PROPAGATION_NEVER,PROPAGATION_SUPPORTS這三種時,就有可能存在事務不生效

7.異常被你 "抓住"了
@Service
public class UserServiceImpl implements UserService {

    @Transactional(rollbackFor = Exception.class)
    public void update(User user) {
        
      try{
        // update user
      }catch(Execption e){
         log.error("異常",e)
      }
    }    
}

異常被抓了,這樣子代理類就沒辦法知道你到底有沒有錯誤,需不需要回滾,所以這種情況也是沒辦法回滾的哦。

8.接口層聲明式事務使用cglib代理
public interface UserService   {

    @Transactional(rollbackFor = Exception.class)
    public void update(User user)  
}
@Service
public class UserServiceImpl implements UserService {

    
    public void update(User user) {
        // update user
    }    
}

通過元素的 "proxy-target-class" 屬性值來控制是基于接口的還是基于類的代理被創(chuàng)建。如果 "proxy-target-class" 屬值被設置為 "true",那么基于類的代理將起作用(這時需要CGLIB庫cglib.jar在CLASSPATH中)。如果 "proxy-target-class" 屬值被設置為 "false" 或者這個屬性被省略,那么標準的JDK基于接口的代理將起作用

注解@Transactional cglib與java動態(tài)代理最大區(qū)別是代理目標對象不用實現(xiàn)接口,那么注解要是寫到接口方法上,要是使用cglib代理,這是注解事務就失效了,為了保持兼容注解最好都寫到實現(xiàn)類方法上。

9.rollbackFor異常指定錯誤
@Service
public class UserServiceImpl implements UserService {

    @Transactional
    public void update(User user) {
        // update user
    }    
}

到此,關于“spring事務失效的原因有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

文章標題:spring事務失效的原因有哪些
當前URL:http://aaarwkj.com/article32/igoipc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供用戶體驗網(wǎng)站建設、網(wǎng)站維護App開發(fā)、微信小程序、網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設
久久精品国产亚洲av亚| 99在线视频午夜福利| 中文字幕在线五月婷婷| 亚洲日本熟妇在线视频| 国产激情一区二区三区| 国产精品原创传媒在线观看 | 国产三级系列在线观看| 国产男女免费操作视频| 调教亚洲另类唯美第二页| 国产激情片午夜福利| 免费在线一区二区av| 亚洲婷婷久久一区二区| 性色av人妻中文一区二区| 色哟哟亚洲精品一区二区| 亚洲精品尤物福利在线一区| 一区二区三区欧美黑人| 亚洲国产成人精品女人久久久′| 91精品国产高清久久福利| 国产91白丝在线观看| 久久99精品国产99久久无| 午夜高清影院免费观看| 亚洲伦理第一页中文字幕| 四虎影院成人精品久久| 国产剧情在线观看网站| 亚洲黄色手机在线网站| 国产综合欧美日韩在线91| 欧美福利免费在线视频| 高清免费国产日日操夜夜草| 亚洲视一区二区三区四区| 亚洲乱码日韩电影网站| 亚洲香蕉视频在线播放| 日韩 欧美 国产 亚洲 综合| 亚洲激情中文字幕av网| 日本一区二区三区久久久| 亚洲国产精品区一区二区| 国产av高清视频在线| 国产亚洲精品视频在线网| 亚洲乱码在线中文字幕| 亚洲欧美日韩国产精品专区| 亚洲精品免费福利视频| 韩国福利短片在线观看|