日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spring事物配置,声明式事务管理和基于@Transactional注解的使用

發布時間:2025/3/21 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring事物配置,声明式事务管理和基于@Transactional注解的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

事物管理對于企業應用來說是至關重要的,好使出現異常情況,它也可以保證數據的一致性。

spring支持編程式事務管理和聲明式事務管理兩種方式。

? ? ?? ?編程式事務管理使用TransactionTemplate或者直接使用底層的PlatformTransactionManager。對于編程式事務管理,spring推薦使用TransactionTemplate。

? ? ? ??聲明式事務管理建立在AOP之上的。其本質是對方法前后進行攔截,然后在目標方法開始之前創建或者加入一個事務,在執行完目標方法之后根據執行情況提交或者回滾事務。聲明式事務最大的優點就是不需要通過編程的方式管理事務,這樣就不需要在業務邏輯代碼中摻雜事務管理的代碼,只需在配置文件中做相關的事務規則聲明(或通過基于@Transactional注解的方式),便可以將事務規則應用到業務邏輯中。

? ? ? ?顯然聲明式事務管理要優于編程式事務管理,這正是spring倡導的非侵入式的開發方式。聲明式事務管理使業務代碼不受污染,一個普通的POJO對象,只要加上注解就可以獲得完全的事務支持。和編程式事務相比,聲明式事務唯一不足地方是,后者的最細粒度只能作用到方法級別,無法做到像編程式事務那樣可以作用到代碼塊級別。但是即便有這樣的需求,也存在很多變通的方法,比如,可以將需要進行事務管理的代碼塊獨立為方法等等。

? ? ? ? ?聲明式事務管理也有兩種常用的方式,一種是基于tx和aop名字空間的xml配置文件,另一種就是基于@Transactional注解。顯然基于注解的方式更簡單易用,更清爽。

spring事務特性

spring所有的事務管理策略類都繼承自org.springframework.transaction.PlatformTransactionManager接口

其中TransactionDefinition接口定義以下特性:

事務隔離級別

? 隔離級別是指若干個并發的事務之間的隔離程度。TransactionDefinition 接口中定義了五個表示隔離級別的常量:

  • TransactionDefinition.ISOLATION_DEFAULT:這是默認值,表示使用底層數據庫的默認隔離級別。對大部分數據庫而言,通常這值就是TransactionDefinition.ISOLATION_READ_COMMITTED。
  • TransactionDefinition.ISOLATION_READ_UNCOMMITTED:該隔離級別表示一個事務可以讀取另一個事務修改但還沒有提交的數據。該級別不能防止臟讀,不可重復讀和幻讀,因此很少使用該隔離級別。比如PostgreSQL實際上并沒有此級別。
  • TransactionDefinition.ISOLATION_READ_COMMITTED:該隔離級別表示一個事務只能讀取另一個事務已經提交的數據。該級別可以防止臟讀,這也是大多數情況下的推薦值。
  • TransactionDefinition.ISOLATION_REPEATABLE_READ:該隔離級別表示一個事務在整個過程中可以多次重復執行某個查詢,并且每次返回的記錄都相同。該級別可以防止臟讀和不可重復讀。
  • TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止臟讀、不可重復讀以及幻讀。但是這將嚴重影響程序的性能。通常情況下也不會用到該級別。

事務傳播行為

? ? ? 所謂事務的傳播行為是指,如果在開始當前事務之前,一個事務上下文已經存在,此時有若干選項可以指定一個事務性方法的執行行為。在TransactionDefinition定義中包括了如下幾個表示傳播行為的常量:

  • TransactionDefinition.PROPAGATION_REQUIRED:如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。這是默認值。
  • TransactionDefinition.PROPAGATION_REQUIRES_NEW:創建一個新的事務,如果當前存在事務,則把當前事務掛起。
  • TransactionDefinition.PROPAGATION_SUPPORTS:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續運行。
  • TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務方式運行,如果當前存在事務,則把當前事務掛起。
  • TransactionDefinition.PROPAGATION_NEVER:以非事務方式運行,如果當前存在事務,則拋出異常。
  • TransactionDefinition.PROPAGATION_MANDATORY:如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。
  • TransactionDefinition.PROPAGATION_NESTED:如果當前存在事務,則創建一個事務作為當前事務的嵌套事務來運行;如果當前沒有事務,則該取值等價于TransactionDefinition.PROPAGATION_REQUIRED。

事務超時

? ? ??所謂事務超時,就是指一個事務所允許執行的最長時間,如果超過該時間限制但事務還沒有完成,則自動回滾事務。在 TransactionDefinition 中以 int 的值來表示超時時間,其單位是秒。

? 默認設置為底層事務系統的超時值,如果底層數據庫事務系統沒有設置超時值,那么就是none,沒有超時限制。

事務只讀屬性

? ? ??只讀事務用于客戶代碼只讀但不修改數據的情形,只讀事務用于特定情景下的優化,比如使用Hibernate的時候。 默認為讀寫事務。


? ? ? ??“只讀事務”并不是一個強制選項,它只是一個“暗示”,提示數據庫驅動程序和數據庫系統,這個事務并不包含更改數據的操作,那么JDBC驅動程序和數據庫就有可能根據這種情況對該事務進行一些特定的優化,比方說不安排相應的數據庫鎖,以減輕事務對數據庫的壓力,畢竟事務也是要消耗數據庫的資源的。?

但是你非要在“只讀事務”里面修改數據,也并非不可以,只不過對于數據一致性的保護不像“讀寫事務”那樣保險而已。?

因此,“只讀事務”僅僅是一個性能優化的推薦配置而已,并非強制你要這樣做不可


spring事務回滾規則

? ? ?指示spring事務管理器回滾一個事務的推薦方法是在當前事務的上下文內拋出異常。spring事務管理器會捕捉任何未處理的異常,然后依據規則決定是否回滾拋出異常的事務。

? ? ? ? 默認配置下,spring只有在拋出的異常為運行時unchecked異常時才回滾該事務,也就是拋出的異常為RuntimeException的子類(Errors也會導致事務回滾),而拋出checked異常則不會導致事務回滾。可以明確的配置在拋出那些異常時回滾事務,包括checked異常。也可以明確定義那些異常拋出時不回滾事務。還可以編程性的通過setRollbackOnly()方法來指示一個事務必須回滾,在調用完setRollbackOnly()后你所能執行的唯一操作就是回滾。


  • myBatis為例 ? 基于注解的聲明式事務管理配置@Transactional

spring.xml

[html]?view plaincopy
  • <span?style="background-color:?rgb(255,?255,?255);"><span?style="background-color:?rgb(255,?204,?153);"><!--?mybatis?config?-->??
  • ????<bean?id="sqlSessionFactory"?class="org.mybatis.spring.SqlSessionFactoryBean">??
  • ????????<property?name="dataSource"?ref="dataSource"?/>??
  • ????????<property?name="configLocation">??
  • ????????????<value>classpath:mybatis-config.xml</value>??
  • ????????</property>??
  • ????</bean>??
  • ??????
  • ????<!--?mybatis?mappers,?scanned?automatically?-->??
  • ????<bean?class="org.mybatis.spring.mapper.MapperScannerConfigurer">??
  • ????????<property?name="basePackage">??
  • ????????????<value>??
  • ????????????????com.baobao.persistence.test??
  • ????????????</value>??
  • ????????</property>??
  • ????????<property?name="sqlSessionFactory"?ref="sqlSessionFactory"?/>??
  • ????</bean>??
  • ??????
  • ????<!--?配置spring的PlatformTransactionManager,名字為默認值?-->??
  • ????<bean?id="transactionManager"?class="org.springframework.jdbc.datasource.DataSourceTransactionManager">??
  • ????????<property?name="dataSource"?ref="dataSource"?/>??
  • ????</bean>??
  • ??????
  • ????<!--?開啟事務控制的注解支持?-->??
  • ????<tx:annotation-driven?transaction-manager="transactionManager"/></span></span>??
  • 添加tx名字空間
    [html]?view plaincopy
  • <span?style="background-color:?rgb(255,?255,?255);"><span?style="background-color:?rgb(255,?204,?153);">xmlns:aop="http://www.springframework.org/schema/aop"?xmlns:tx="http://www.springframework.org/schema/tx"??
  • ??
  • xsi:schemaLocation="http://www.springframework.org/schema/aop?http://www.springframework.org/schema/aop/spring-aop-3.0.xsd??
  • ????http://www.springframework.org/schema/tx?http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"</span></span>??

  • ? ? ? ? MyBatis自動參與到spring事務管理中,無需額外配置,只要org.mybatis.spring.SqlSessionFactoryBean引用的數據源與DataSourceTransactionManager引用的數據源一致即可,否則事務管理會不起作用。

    @Transactional注解

    @Transactional屬性?

    屬性 類型 描述
    value String 可選的限定描述符,指定使用的事務管理器
    propagation enum: Propagation 可選的事務傳播行為設置
    isolation enum: Isolation 可選的事務隔離級別設置
    readOnly boolean 讀寫或只讀事務,默認讀寫
    timeout int (in seconds granularity) 事務超時時間設置
    rollbackFor Class對象數組,必須繼承自Throwable 導致事務回滾的異常類數組
    rollbackForClassName 類名數組,必須繼承自Throwable 導致事務回滾的異常類名字數組
    noRollbackFor Class對象數組,必須繼承自Throwable 不會導致事務回滾的異常類數組
    noRollbackForClassName 類名數組,必須繼承自Throwable 不會導致事務回滾的異常類名字數組

    用法

    ? ? ? ?@Transactional 可以作用于接口、接口方法、類以及類方法上。當作用于類上時,該類的所有 public 方法將都具有該類型的事務屬性,同時,我們也可以在方法級別使用該標注來覆蓋類級別的定義。

    ? ? ? ? ?雖然 @Transactional 注解可以作用于接口、接口方法、類以及類方法上,但是 Spring 建議不要在接口或者接口方法上使用該注解,因為這只有在使用基于接口的代理時它才會生效。另外, @Transactional 注解應該只被應用到 public 方法上,這是由 Spring AOP 的本質決定的。如果你在 protected、private 或者默認可見性的方法上使用 @Transactional 注解,這將被忽略,也不會拋出任何異常。

    ? ? ? ? 默認情況下,只有來自外部的方法調用才會被AOP代理捕獲,也就是,類內部方法調用本類內部的其他方法并不會引起事務行為,即使被調用方法使用@Transactional注解進行修飾。

    [java]?view plaincopy
  • @Autowired??
  • private?MyBatisDao?dao;??
  • ??
  • @Transactional??
  • @Override??
  • public?void?insert(Test?test)?{??
  • ????dao.insert(test);??
  • ????throw?new?RuntimeException("test");//拋出unchecked異常,觸發事物,回滾??
  • }??
  • noRollbackFor
    [java]?view plaincopy
  • @Transactional(noRollbackFor=RuntimeException.class)??
  • ????@Override??
  • ????public?void?insert(Test?test)?{??
  • ????????dao.insert(test);??
  • ????????//拋出unchecked異常,觸發事物,noRollbackFor=RuntimeException.class,不回滾??
  • ????????throw?new?RuntimeException("test");??
  • ????}??
  • 類,當作用于類上時,該類的所有 public 方法將都具有該類型的事務屬性

    [java]?view plaincopy
  • @Transactional??
  • public?class?MyBatisServiceImpl?implements?MyBatisService?{??
  • ??
  • ????@Autowired??
  • ????private?MyBatisDao?dao;??
  • ??????
  • ??????
  • ????@Override??
  • ????public?void?insert(Test?test)?{??
  • ????????dao.insert(test);??
  • ????????//拋出unchecked異常,觸發事物,回滾??
  • ????????throw?new?RuntimeException("test");??
  • ????}??
  • propagation=Propagation.NOT_SUPPORTED

    [java]?view plaincopy
  • @Transactional(propagation=Propagation.NOT_SUPPORTED)??
  • @Override??
  • public?void?insert(Test?test)?{??
  • ????//事物傳播行為是PROPAGATION_NOT_SUPPORTED,以非事務方式運行,不會存入數據庫??
  • ????dao.insert(test);??
  • }??
    • myBatis為例 ? 基于注解的聲明式事務管理配置,xml配置

    主要為aop切面配置,只看xml就可以了

    [html]?view plaincopy
  • <!--?事物切面配置?-->??
  • <tx:advice?id="advice"?transaction-manager="transactionManager">??
  • ????<tx:attributes>??
  • ????????<tx:method?name="update*"?propagation="REQUIRED"?read-only="false"?rollback-for="java.lang.Exception"/>??
  • ????????<tx:method?name="insert"?propagation="REQUIRED"?read-only="false"/>??
  • ????</tx:attributes>??
  • </tx:advice>??
  • ??
  • <aop:config>??
  • ????<aop:pointcut?id="testService"?expression="execution?(*?com.baobao.service.MyBatisService.*(..))"/>??
  • ????<aop:advisor?advice-ref="advice"?pointcut-ref="testService"/>??
  • </aop:config>??

  • from:?http://blog.csdn.net/bao19901210/article/details/41724355 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的spring事物配置,声明式事务管理和基于@Transactional注解的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 午夜久久久久久久久久 | 国产按摩一区二区三区 | 肉色丝袜脚交一区二区 | 久久久久久毛片 | 天天干夜夜操 | 欧美另类视频在线观看 | 欧美做爰爽爽爽爽爽爽 | 日本视频在线观看免费 | 国产午夜伦鲁鲁 | 欧美一级少妇 | 国产精品不卡 | 亚洲精品久久久蜜桃网尤妮丝 | 欧美性天堂| 亚洲国产精品毛片av不卡在线 | 成人三级在线视频 | 天天草天天摸 | 成人一区视频 | 免费欧美视频 | 国产精品热久久 | 国产精品视频久久久久久久 | 中国女人毛片 | 国产少妇自拍 | 狠狠干综合网 | 在线观看日批 | av中文字幕亚洲 | 色01看片网 | av短片| 波多野结衣在线观看一区 | 久久av色 | 午夜影院污 | 天天操天天干天天 | 图片区亚洲色图 | 国产91美女视频 | 成人免费激情视频 | 朝桐光av一区二区三区 | 男女午夜影院 | 男女午夜啪啪 | 欧美视频一区二区三区 | 欧美日韩久久婷婷 | 与子敌伦刺激对白播放的优点 | 久久爱一区二区 | gai免费观看网站外网 | 亚洲AV成人无码网站天堂久久 | 熟女毛片| 国产精品主播 | h文在线观看 | 亚洲熟妇av乱码在线观看 | 人妻在卧室被老板疯狂进入 | 四虎影视免费在线观看 | 日韩成人不卡 | 99青草 | 91精品国产高清一区二区三区蜜臀 | 国产一区二区视频免费在线观看 | 一级特黄视频 | 国产精品视频一二三区 | 狠狠躁夜夜躁人人爽视频 | sm调教羞耻姿势图片 | 免费在线黄色网址 | 就要操av| 国产99在线 | 免费看国产曰批40分钟粉红裤头 | 欧美天堂在线观看 | 6080久久 | 黄色在线观看网站 | 麻豆一区产品精品蜜桃的特点 | 国产天堂| 双女主黄文| 六月丁香婷婷激情 | 国产乱人| 久久高清av | 东京热加勒比无码少妇 | 色呦呦国产精品 | 99热在线这里只有精品 | 精品一二区 | 中文字幕一区二区三区在线视频 | 秋霞欧美在线观看 | 欧美在线va | 啄木乌欧美一区二区三区 | 国产精品久久久久高潮 | 97久久人人超碰caoprom欧美 | 免费又黄又爽又色的视频 | 中文字幕av网址 | 国产视频久久久 | 国产另类在线 | 亚洲激情欧美激情 | 国产黄a三级 | 泰国午夜理伦三级 | 日日干天天射 | 精品肉丝脚一区二区三区 | 日韩欧美国产成人精品免费 | 欧美日韩一区二区电影 | 亚洲熟妇无码一区二区三区导航 | 免费淫片 | 二区三区在线视频 | 国产一在线 | 全黄一级裸体片 | 精品一区二区三区在线免费观看 | 久久久亚洲av波多野结衣 | 2025韩国大尺度电影 |