1. <nobr id="easjo"><address id="easjo"></address></nobr>

      <track id="easjo"><source id="easjo"></source></track>
      1. 
        

      2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
      3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>
          貴州做網站公司
          貴州做網站公司~專業!靠譜!
          10年網站模板開發經驗,熟悉國內外開源網站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等網站程序,可為您提供網站建設,網站克隆,仿站,網頁設計,網站制作,網站推廣優化等服務。我們專注高端營銷型網站,企業官網,集團官網,自適應網站,手機網站,網絡營銷,網站優化,網站服務器環境搭建以及托管運維等。為客戶提供一站式網站解決方案?。?!

          spring事務(Spring事務的詳細介紹)

          來源:互聯網轉載 時間:2024-05-12 16:07:50

          前言

          Spring事務管理我相信大家都用得很多,但可能僅僅局限于一個@Transactional注解或者在XML中配置事務相關的東西。不管怎么說,日常可能足夠我們去用了。但作為程序員,無論是為了面試還是說更好把控自己寫的代碼,還是應該得多多了解一下Spring事務的一些細節。

          這里我拋出幾個問題,看大家能不能瞬間答得上:

          • 如果嵌套調用含有事務的方法,在Spring事務管理中,這屬于哪個知識點?

          • 我們使用的框架可能是Hibernate/JPA或者是Mybatis,都知道的底層是需要一個session/connection對象來幫我們執行操作的。要保證事務的完整性,我們需要多組數據庫操作要使用同一個session/connection對象,而我們又知道Spring IOC所管理的對象默認都是單例的,這為啥我們在使用的時候不會引發線程安全問題呢?內部Spring到底干了什么?

          • 人家所說的BPP又是啥東西?

          • Spring事務管理重要接口有哪幾個?

          一、閱讀本文需要的基礎知識

          閱讀這篇文章的同學我默認大家都對Spring事務相關知識有一定的了解了。(ps:如果不了解點解具體的文章去閱讀再回到這里來哦)

          我們都知道,Spring事務是Spring AOP的最佳實踐之一,所以說AOP入門基礎知識(簡單配置,使用)是需要先知道的。如果想更加全面了解AOP可以看這篇文章:AOP重要知識點(術語介紹、全面使用)。說到AOP就不能不說AOP底層原理:動態代理設計模式。到這里,對AOP已經有一個基礎的認識了。于是我們就可以使用XML/注解方式來配置Spring事務管理。

          在IOC學習中,可以知道的是Spring中Bean的生命周期(引出BPP對象)并且IOC所管理的對象默認都是單例的:單例設計模式,單例對象如果有"狀態"(有成員變量),那么多線程訪問這個單例對象,可能就造成線程不安全。那么何為線程安全?,解決線程安全有很多方式,但其中有一種:讓每一個線程都擁有自己的一個變量:ThreadLocal

          如果對我以上說的知識點不太了解的話,建議點擊藍字進去學習一番。

          二、兩個不靠譜直覺的例子

          2.1第一個例子

          之前朋友問了我一個例子:

          在Service層拋出Exception,在Controller層捕獲,那如果在Service中有異常,那會事務回滾嗎?

          //Service方法

          @Transactional
          publicEmployeeaddEmployee()throwsException{

          Employeeemployee=newEmployee("3y",23);
          employeeRepository.save(employee);
          //假設這里出了Exception
          inti=1/0;

          returnemployee;
          }

          //Controller調用
          @RequestMapping("/add")
          publicEmployeeaddEmployee(){
          Employeeemployee=null;
          try{
          employee=employeeService.addEmployee();
          }catch(Exceptione){
          e.printStackTrace();
          }
          returnemployee;

          }

          第一反應:不會回滾吧。

          • 我當時是這樣想的:因為Service層已經拋出了異常,由Controller捕獲。那是否回滾應該由Controller的catch代碼塊中邏輯來決定,如果catch代碼塊沒有回滾,那應該是不會回滾。

          但朋友經過測試說,可以回滾阿。(pappapa打臉)

          看了一下文檔,原來文檔有說明:

          By default checked exceptions do not result in the transactional interceptor marking the transaction for rollback and instances of RuntimeException and its subclasses do

          結論:如果是編譯時異常不會自動回滾,如果是運行時異常,那會自動回滾!

          2.2第二個例子

          第二個例子來源于知乎@柳樹文章,文末會給出相應的URL

          我們都知道,帶有@Transactional注解所包圍的方法就能被Spring事務管理起來,那如果我在當前類下使用一個沒有事務的方法去調用一個有事務的方法,那我們這次調用會怎么樣?是否會有事務呢?

          用代碼來描述一下:

          //沒有事務的方法去調用有事務的方法
          publicEmployeeaddEmployee2Controller()throwsException{

          returnthis.addEmployee();
          }

          @Transactional
          publicEmployeeaddEmployee()throwsException{

          employeeRepository.deleteAll();
          Employeeemployee=newEmployee("3y",23);

          //模擬異常
          inti=1/0;

          returnemployee;
          }

          我第一直覺是:這跟Spring事務的傳播機制有關吧。

          其實這跟Spring事務的傳播機制沒有關系,下面我講述一下:

          • Spring事務管理用的是AOP,AOP底層用的是動態代理。所以如果我們在類或者方法上標注注解@Transactional,那么會生成一個代理對象。

          接下來我用圖來說明一下:

          顯然地,我們拿到的是代理(Proxy)對象,調用addEmployee2Controller()方法,而addEmployee2Controller()方法的邏輯是target.addEmployee(),調用回原始對象(target)的addEmployee()。所以這次的調用壓根就沒有事務存在,更談不上說Spring事務傳播機制了。

          原有的數據:

          測試結果:壓根就沒有事務的存在

          2.2.1再延伸一下

          從上面的測試我們可以發現:如果是在本類中沒有事務的方法來調用標注注解@Transactional方法,最后的結論是沒有事務的。那如果我將這個標注注解的方法移到別的Service對象上,有沒有事務?

          @Service
          publicclassTestService{

          @Autowired
          privateEmployeeRepositoryemployeeRepository;

          @Transactional
          publicEmployeeaddEmployee()throwsException{

          employeeRepository.deleteAll();

          Employeeemployee=newEmployee("3y",23);

          //模擬異常
          inti=1/0;

          returnemployee;
          }

          }


          @Service
          publicclassemployeeService{

          @Autowired
          privateTestServicetestService;
          //沒有事務的方法去調用別的類有事務的方法
          publicEmployeeaddEmployee2Controller()throwsException{
          returntestService.addEmployee();
          }
          }

          測試結果:

          因為我們用的是代理對象(Proxy)去調用addEmployee()方法,那就當然有事務了。

          看完這兩個例子,有沒有覺得3y的直覺是真的水!

          三、Spring事務傳播機制

          如果嵌套調用含有事務的方法,在Spring事務管理中,這屬于哪個知識點?

          在當前含有事務方法內部調用其他的方法(無論該方法是否含有事務),這就屬于Spring事務傳播機制的知識點范疇了。

          Spring事務基于Spring AOP,Spring AOP底層用的動態代理,動態代理有兩種方式:

          • 基于接口代理(JDK代理)

            • 基于接口代理,凡是類的方法非public修飾,或者用了static關鍵字修飾,那這些方法都不能被Spring AOP增強

          • 基于CGLib代理(子類代理)

            • 基于子類代理,凡是類的方法使用了private、static、final修飾,那這些方法都不能被Spring AOP增強

          至于為啥以上的情況不能增強,用你們的腦瓜子想一下就知道了。

          值得說明的是:那些不能被Spring AOP增強的方法并不是不能在事務環境下工作了。只要它們被外層的事務方法調用了,由于Spring事務管理的傳播級別,內部方法也可以工作在外部方法所啟動的事務上下文中。

          至于Spring事務傳播機制的幾個級別,我在這里就不貼出來了。這里只是再次解釋“啥情況才是屬于Spring事務傳播機制的范疇”。

          四、多線程問題

          我們使用的框架可能是Hibernate/JPA或者是Mybatis,都知道的底層是需要一個session/connection對象來幫我們執行操作的。要保證事務的完整性,我們需要多組數據庫操作要使用同一個session/connection對象,而我們又知道Spring IOC所管理的對象默認都是單例的,這為啥我們在使用的時候不會引發線程安全問題呢?內部Spring到底干了什么?

          回想一下當年我們學Mybaits的時候,是怎么編寫Session工具類?

          沒錯,用的就是ThreadLocal,同樣地,Spring也是用的ThreadLocal。

          以下內容來源《精通 Spring4.x》

          我們知道在一般情況下,只有無狀態的Bean才可以在多線程環境下共享,在Spring中,絕大部分Bean都可以聲明為singleton作用域。就是因為Spring對一些Bean(如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等)中非線程安全狀態的“狀態性對象”采用ThreadLocal封裝,讓它們也成為線程安全的“狀態性對象”,因此,有狀態的Bean就能夠以singleton的方式在多線程中工作。

          我們可以試著點一下進去TransactionSynchronizationManager中看一下:

          五、啥是BPP?

          BBP的全稱叫做:BeanPostProcessor,一般我們俗稱對象后處理器

          • 簡單來說,通過BeanPostProcessor可以對我們的對象進行“加工處理”。

          Spring管理Bean(或者說Bean的生命周期)也是一個???/strong>的知識點,我在秋招也重新整理了一下步驟,因為比較重要,所以還是在這里貼一下吧:

          1. ResouceLoader加載配置信息

          2. BeanDefintionReader解析配置信息,生成一個一個的BeanDefintion

          3. BeanDefintion由BeanDefintionRegistry管理起來

          4. BeanFactoryPostProcessor對配置信息進行加工(也就是處理配置的信息,一般通過PropertyPlaceholderConfigurer來實現)

          5. 實例化Bean

          6. 如果該Bean配置/實現了InstantiationAwareBean,則調用對應的方法

          7. 使用BeanWarpper來完成對象之間的屬性配置(依賴)

          8. 如果該Bean配置/實現了Aware接口,則調用對應的方法

          9. 如果該Bean配置了BeanPostProcessor的before方法,則調用

          10. 如果該Bean配置了init-method或者實現InstantiationBean,則調用對應的方法

          11. 如果該Bean配置了BeanPostProcessor的after方法,則調用

          12. 將對象放入到HashMap中

          13. 最后如果配置了destroy或者DisposableBean的方法,則執行銷毀操作

          其中也有關于BPP圖片:

          5.1為什么特意講BPP?

          Spring AOP編程底層通過的是動態代理技術,在調用的時候肯定用的是代理對象。那么Spring是怎么做的呢?

          我只需要寫一個BPP,在postProcessBeforeInitialization或者postProcessAfterInitialization方法中,對對象進行判斷,看他需不需要織入切面邏輯,如果需要,那我就根據這個對象,生成一個代理對象,然后返回這個代理對象,那么最終注入容器的,自然就是代理對象了。

          Spring提供了BeanPostProcessor,就是讓我們可以對有需要的對象進行“加工處理”啊!

          六、認識Spring事務幾個重要的接口

          Spring事務可以分為兩種:

          • 編程式事務(通過代碼的方式來實現事務)

          • 聲明式事務(通過配置的方式來實現事務)

          編程式事務在Spring實現相對簡單一些,而聲明式事務因為封裝了大量的東西(一般我們使用簡單,里頭都非常復雜),所以聲明式事務實現要難得多。

          在編程式事務中有以下幾個重要的了接口:

          • TransactionDefinition:定義了Spring兼容的事務屬性(比如事務隔離級別、事務傳播、事務超時、是否只讀狀態)

          • TransactionStatus:代表了事務的具體運行狀態(獲取事務運行狀態的信息,也可以通過該接口間接回滾事務等操作)

          • PlatformTransactionManager:事務管理器接口(定義了一組行為,具體實現交由不同的持久化框架來完成---類比JDBC)

          在聲明式事務中,除了TransactionStatus和PlatformTransactionManager接口,還有幾個重要的接口:

          • TransactionProxyFactoryBean:生成代理對象

          • TransactionInterceptor:實現對象的攔截

          • TransactionAttrubute:事務配置的數據

          “Spring事務的詳細介紹”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注本站網站,小編將為大家輸出更多高質量的實用文章!

          標簽:spring事務-

          c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...

          2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...

          :喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...

          (資料圖片僅供參考)據美媒紐報當地時間22日稱,傳媒大亨魯伯特·默多克(Rupert Murdoch)即將迎來人生第4次離婚。據英媒11日稱,霍爾曾在前一日要求法院取消離婚申請。但就在此消息流出短短幾小時后,二人就正式公布完成離婚。英媒稱,10日晚間,默多克發言人代二人發表一份聲明,稱他們離婚了但“仍然是好朋友”。據悉,默多克和霍爾結婚6年。2022年,魯伯特...

          銀監會七不準是什么?1.不允許貸款轉讓信貸業務應堅持貸款實際支付和委托支付的原則,將全部貸款資金直接支付給借款人的交易對手。不允許強行設定條件或協商將部分貸款轉為存款。2.不允許存貸款掛鉤貸款業務和存款業務應嚴格分開,存款不應作為審批和發放貸款的前提。3.不允許貸款收費要求客戶接受不合理的中介業務或其他金融服務,收取費用。不允許通過發放貸款或其他方式提供融資等方式.4.不浮利分費要遵循利費分離的原...

          (相關資料圖)最近小編看到大家都在討論形容墨汁香味的詞語有哪些相關的事情,對此呢小編也是非常的感應興趣,那么這件事究竟是怎么發生的呢?具體又是怎么回事呢?下面就是小編搜索到的關于形容墨汁香味的詞語有哪些事件的相關信息,我們一起來看一下吧!形容墨汁香味的詞語:虎墨沉香、德藝雙馨、明德惟馨 、馨香禱祝,等等。1、 虎墨沉香;釋義: 說墨汁在一定期限范圍內會發出特別的清香味。2、 德藝雙馨 ;釋義:形...

          TOP
          国产初高中生视频在线观看|亚洲一区中文|久久亚洲欧美国产精品|黄色网站入口免费进人
          1. <nobr id="easjo"><address id="easjo"></address></nobr>

              <track id="easjo"><source id="easjo"></source></track>
              1. 
                

              2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
              3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>