Spring聲明式事務詳解

      網(wǎng)友投稿 666 2025-03-31

      1 事務管理


      提供的統(tǒng)一的API接口支持不同的資源

      提供聲明式事務管理

      方便的與spring框架集成

      多個資源的事務管理、同步

      2 事務抽象

      2.1 事務管理器 - PlatformTransactionManager

      public interface PlatformTransactionManager { TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; void commit(TransactionStatus status) throws TransactionException; void rollback(TransactionStatus status) throws TransactionException; }

      1

      2

      3

      4

      5

      6

      2.2 事務定義 - TransactionDefinition

      public interface TransactionDefinition { int getPropagationBehavior(); int getlsolationLevel(); String getName(); int getTimeout(); boolean isReadOnly(); }

      1

      2

      3

      4

      5

      6

      7

      2.3 事務隔離機制

      TransactionDefinition.ISOLATION_DEFAULT TransactionDefinition.ISOLATION_READ_COMMITTED TransactionDefinition.ISOLATION_READ_UNCOMMITTED TransactionDefinition.ISOLATION_REPEATABLE_READ TransactionDefinition.ISOLATION_SERIALIZABLE

      1

      2

      3

      4

      5

      2.4 事務傳播機制

      TransactionDefinition接口定義了如下int 常量:

      PROPAGATION_REQUIRED (Default)

      支持當前事務; 如果不存在,請創(chuàng)建一個新的。事務定義的默認設置,并且定義了事務同步的作用域

      PROPAGATION_SUPPORTS

      支持當前事務; 如果不存在,則以非事務方式執(zhí)行。

      對于具有事務同步的事務管理器, PROPAGATION_SUPPORTS與根本沒有事務略有不同,因為它定義了同步可能適用的事務范圍。 結果,將為整個指定范圍共享相同的資源(JDBC Connection ,Hibernate Session等)。

      準確的行為取決于事務管理器的實際同步配置!

      通常,請謹慎使用PROPAGATION_SUPPORTS ! 特別是,不要依賴PROPAGATION_SUPPORTS范圍內(nèi)的

      PROPAGATION_REQUIRED

      PROPAGATION_REQUIRES_NEW (這可能會在運行時導致同步?jīng)_突)

      如果這種嵌套是不可避免的,請確保正確配置事務管理器(通常切換為“實際事務同步”)

      PROPAGATION_MANDATORY

      PROPAGATION_REQUIRES_NEW

      PROPAGATION_NOT_SUPPORTED

      不支持當前事務;而是始終以非事務方式執(zhí)行。類似于同名的EJB事務屬性。

      實際的事務中止將無法在所有事務管理器中立即使用。 這尤其適用于org.springframework.transaction.jta.JtaTransactionManager ,它要求javax.transaction.TransactionManager對其可用(在標準Java EE中是特定于服務器的)。

      事務同步在PROPAGATION_NOT_SUPPORTED作用域內(nèi)不可用。 現(xiàn)有同步將被掛起并適時恢復

      TransactionDefinition.PROPAGATION_NEVER

      不支持當前事務;如果當前事務存在,則拋異常。類似于同名的EJB事務屬性。事務同步在PROPAGATION_NEVER作用域內(nèi)不可用

      PROPAGATION_NESTEDED

      REQUIRED

      適用于增刪改

      SUPPORTS

      適用于查詢。

      TransactionStatus

      Spring提供了PlatformTransactionManager表示事務管理器,所有事務都由它管理。

      而事務由TransactionStatus表示。

      public interface TransactionStatus extends SavepointManager { boolean isNewTransaction(); boolean hasSavepoint(); void setRollbackOnly(); boolean isRollbackOnly(); boolean isCompleted(); }

      1

      2

      3

      4

      5

      6

      7

      如果手寫事務代碼,使用try…catch如下:

      TransactionStatus tx = null; try { // 開啟事務: tx = txManager.getTransaction(new DefaultTransactionDefinition()); // 相關JDBC操作: jdbcTemplate.update("..."); jdbcTemplate.update("..."); // 提交事務: txManager.commit(tx); } catch (RuntimeException e) { // 回滾事務: txManager.rollback(tx); throw e; }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      Spring聲明式事務詳解

      13

      14

      為啥要抽象出PlatformTransactionManager和TransactionStatus?

      JavaEE除了提供JDBC事務,還支持分布式事務JTA(Java Transaction API)。分布式事務是指多個數(shù)據(jù)源(比如多個數(shù)據(jù)庫,多個消息系統(tǒng))要在分布式環(huán)境下實現(xiàn)事務的時候,應該怎么實現(xiàn)。分布式事務實現(xiàn)起來非常復雜,簡單說就是通過一個分布式事務管理器實現(xiàn)兩階段提交,但本身數(shù)據(jù)庫事務就不快,基于數(shù)據(jù)庫事務實現(xiàn)的分布式事務就慢得難以忍受,所以使用率不高。

      Spring為了同時支持JDBC和JTA兩種事務模型,就抽象出PlatformTransactionManager。

      因為我們的代碼只需要JDBC事務,因此,在AppConfig中,需要再定義一個PlatformTransactionManager對應的Bean,它的實際類型是DataSourceTransactionManager:

      @Configuration @ComponentScan @PropertySource("jdbc.properties") public class AppConfig { ... @Bean PlatformTransactionManager createTxManager(@Autowired DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      3 代碼實戰(zhàn)

      public OrderService { @Autowire PlatformTransactionManager txManager void buyTicket(BuyTicketDTO dto) { DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION REQUIRED); TransactionStatus status = txManager.getTransaction(def); try { //執(zhí)行業(yè)務代碼 txManager.commit(status); } catch (Exception e) { txManager.rollback(status); } } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      Transactional標簽方式實現(xiàn)1

      public OrderService { @Transactonal void buyTicket(BuyTicketDTO dto) { / save order // finish customer pay // transfer tickets } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      Transactional標簽方式實現(xiàn)2

      public OrderServiceProxy { void buyTicket(BuyTicketDTO dto) { // get and begin transaction manager from context try{ orderServicelmpl.buyTicket(dto); // commit transaction } catch (Exceptione) { // roolbback transaction } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      執(zhí)行原理流程圖

      PlatformTransactionManager常見實現(xiàn)

      DataSourceTransactionManager

      JpaTransactionManager

      JmsTransactionManager

      JtaTransactionManager

      但使用聲明式事務經(jīng)常遇到問題:

      數(shù)據(jù)庫連接耗盡

      處理中的問題(比如調(diào)用接口超時)

      JDBC Spring

      版權聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權內(nèi)容。

      版權聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權內(nèi)容。

      上一篇:Excel中快速創(chuàng)建車速表圖表
      下一篇:云原生必備知識——kubernetes和Karmada【與云原生的故事】
      相關文章
      一本色道久久综合亚洲精品| 春暖花开亚洲性无区一区二区| 亚洲成AⅤ人影院在线观看| 成人亚洲国产va天堂| 亚洲第一永久在线观看| 亚洲精品无码成人AAA片| 国产亚洲美女精品久久久2020| 亚洲午夜国产片在线观看| 亚洲Av无码乱码在线播放| 国产亚洲精品美女久久久久| 亚洲日本VA中文字幕久久道具| 精品亚洲成A人无码成A在线观看 | 亚洲av永久中文无码精品| 亚洲AV永久无码精品网站在线观看| 亚洲精品午夜国产va久久| 狠狠色香婷婷久久亚洲精品| 亚洲无砖砖区免费| 亚洲国产日韩在线人成下载| 亚洲美免无码中文字幕在线| 亚洲欧洲国产精品久久| 亚洲日韩中文字幕| 亚洲精品中文字幕无码AV| 激情内射亚洲一区二区三区| 亚洲综合网站色欲色欲| 亚洲精品无码久久久久sm| 久久久青草青青亚洲国产免观| 久久久无码精品亚洲日韩蜜桃| 久久精品国产亚洲AV网站| 久久亚洲AV成人无码国产| 亚洲美女精品视频| 精品日韩99亚洲的在线发布| 亚洲伊人久久大香线蕉AV| 亚洲色偷精品一区二区三区| 亚洲色欲色欲www在线播放| 亚洲av无码av在线播放| 狼人大香伊蕉国产WWW亚洲| 国产综合成人亚洲区| 亚洲精品色婷婷在线影院| 国产亚洲美女精品久久久| 日本亚洲视频在线| 亚洲精品视频久久|