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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

(九)Spring 事务开发、事务属性详解

發(fā)布時(shí)間:2023/12/3 javascript 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (九)Spring 事务开发、事务属性详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

持久層

目錄

  • 事務(wù)回顧
  • Spring 控制事務(wù)的開發(fā)
  • Spring 中的事務(wù)屬性(Transaction Attribute)
  • 隔離屬性(ISOLATION)
  • 傳播屬性(PROPAGATION)
  • 只讀屬性(readOnly)
  • 超時(shí)屬性(timeout)
  • 異常屬性
  • 事務(wù)屬性常見配置總結(jié)
  • 基于標(biāo)簽的事務(wù)配置方式

?

事務(wù)回顧

什么是事務(wù)?

  • 事務(wù)時(shí)保證業(yè)務(wù)操作完整性的一種數(shù)據(jù)庫機(jī)制

事務(wù)的 4 大特點(diǎn):?A、C、I、D

  • A?原子性
  • C?一致性
  • I?隔離性
  • D?持久性

如何控制事務(wù)?(JDBC、Mybatis)
JDBC

  • Connection.setAutoCommit(false);
  • Connection.commit();
  • Connection.rollback();

Mybatis

  • Mybatis 自動(dòng)開啟事務(wù)
  • sqlSession.commit();,底層還是調(diào)用的?Connection
  • sqlSession.rollback();,底層還是調(diào)用的?Connection

結(jié)論:控制事務(wù)的底層,都是通過?Connection?對(duì)象完成的。

Spring 控制事務(wù)的開發(fā)

  • 搭建開發(fā)環(huán)境?pom.xml
<dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.2.6.RELEASE</version> </dependency>
  • 編碼
<bean id="userService" class="com.yusael.service.UserServiceImpl"><property name="userDAO" ref="userDAO"/> </bean><!--DataSourceTransactionManager--> <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/> </bean>@Transactional public class UserServiceImpl implements UserService {private UserDAO userDAO;<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
  • 細(xì)節(jié)
    進(jìn)行動(dòng)態(tài)代理底層實(shí)現(xiàn)的切換,默認(rèn)?false?是 JDK,true?是 Cglib。
<tx:annotation-driven transaction-manager="dataSourceTransactionManager" proxy-target-class="true"/>

Spring 中的事務(wù)屬性(Transaction Attribute)

什么是事務(wù)屬性

屬性:描述物體特征的一系列值(性別、身高、體重)

事務(wù)屬性:描述事務(wù)特征的一系列值

  • 隔離屬性
  • 傳播屬性
  • 只讀屬性
  • 超時(shí)屬性
  • 異常屬性
  • 如何添加事務(wù)屬性?

    @Transactional(isolation=, propagation=, readOnly=,timeout=,rollbackFor,noRollbackFor=,)

    隔離屬性(ISOLATION)

    概念:描述了事務(wù)解決并發(fā)問題的特征

  • 什么是并發(fā)?
    多個(gè)事務(wù)(用戶)在同一時(shí)間,訪問操作了相同的數(shù)據(jù)。
    同一時(shí)間:0.000 幾秒左右
  • 并發(fā)會(huì)產(chǎn)生那些問題?
    • 臟讀
    • 不可重復(fù)讀
    • 幻影讀
  • 并發(fā)問題如何解決?
    通過隔離屬性解決,隔離屬性中設(shè)置不同過的值,解決并發(fā)處理的過程中的問題。

  • 事務(wù)并發(fā)產(chǎn)生的問題:

    • 臟讀
      一個(gè)事務(wù),讀取了另一個(gè)事務(wù)中沒有提交的數(shù)據(jù),會(huì)在本事務(wù)中產(chǎn)生數(shù)據(jù)不一樣的現(xiàn)象
      解決方案:@Transaction(isolation=Isolation.READ_COMMITTED)
    • 不可重復(fù)讀
      一個(gè)事務(wù)中,多次讀取相同的數(shù)據(jù),但是讀取結(jié)果不一樣,會(huì)在本事務(wù)中產(chǎn)生數(shù)據(jù)不一樣的現(xiàn)象
      注意:1.不是臟讀 2.在一個(gè)事務(wù)中
      解決方案:@Transaction(isolation=Isolation.REPEATABLE_READ)
      本質(zhì):一把行鎖(對(duì)數(shù)據(jù)庫表的某一行加鎖)
    • 幻影讀
      一個(gè)事務(wù)中,多次對(duì)整表進(jìn)行查詢統(tǒng)計(jì),但是結(jié)果不一樣,會(huì)在本事務(wù)中產(chǎn)生數(shù)據(jù)不一致的問題
      解決方案:@Transaction(isolation=Isolation.SERIALIZABLE)
      本質(zhì):表鎖(對(duì)數(shù)據(jù)庫某個(gè)表加鎖)

    安全與效率對(duì)比:

    • 并發(fā)安全:SERIALIZABLE?>?READ_ONLY?>?READ_COMMITTED
    • 運(yùn)行效率:READ_COMMITTED?>?READ_ONLY?>?SERIALIZABLE

    數(shù)據(jù)庫對(duì)隔離屬性的支持:

    隔離屬性的值MySQLOracle
    ISOLATION_READ_COMMITTED支持支持
    ISOLATION_REPEATABLE_READ支持不支持
    ISOLATION_SERIALIZABLE支持支持hi
    • Oracle 不支持?REPEATABLE_READ,那該如何解決不可重復(fù)讀?
      采用?多版本比對(duì)?的方式解決不可重復(fù)讀問題。

    默認(rèn)的隔離屬性

    • Spring 會(huì)指定為?ISOLATION_DEFAULT,調(diào)用不同數(shù)據(jù)庫所設(shè)置的默認(rèn)隔離屬性
      MySQL:REPEATABLE_READ
      Oracle:READ_COMMITTED
    • 查看數(shù)據(jù)庫的默認(rèn)隔離屬性:
      MySQL:SELECT @@tx_isolation;
      Oracle:較麻煩,建議百度。

    隔離屬性在實(shí)驗(yàn)中的建議

    • 推薦使用 Spring 默認(rèn)指定的?ISOLATION_DEFAULT
    • 未來的實(shí)戰(zhàn)中,遇到并發(fā)訪問的情況,很少見
    • 如果真的遇到并發(fā)問題,解決方案:樂觀鎖
      Hibernate(JPA):version
      MyBatis:通過攔截器自定義開發(fā)

    傳播屬性(PROPAGATION)

    概念:描述了事務(wù)解決?嵌套 問題?的特征。

    事務(wù)的嵌套:指的是一個(gè)大的事務(wù)中,包含了若干個(gè)小的事務(wù)。

    事務(wù)嵌套產(chǎn)生的問題: 大事務(wù)中融入了很多小的事務(wù),他們彼此影響,最終就導(dǎo)致外部大的事務(wù)喪失了事務(wù)的原子性。

    傳播屬性的值及其用法:

    傳播屬性的值外部不存在事務(wù)外部存在事務(wù)用法備注
    REQUIRED開啟新的事務(wù)融合到外部事務(wù)中@Transactional(propagation = Propagation.REQUIRED)增、刪、改方法
    SUPPORTS不開啟事務(wù)融合到外部事務(wù)中@Transactional(propagation = Propagation.SUPPORTS)查詢方法
    REQUIRES_NEW開啟新的事務(wù)掛起外部事務(wù),創(chuàng)建新的事務(wù)@Transactional(propagation = Propagation.REQUIRES_NEW)日志記錄方法中
    NOT_SUPPORTED不開啟事務(wù)掛起外部事務(wù)@Transactional(propagation = Propagation.NOT_SUPPORTED)極其不常用
    NEVER不開啟事務(wù)拋出異常@Transactional(propagation = Propagation.NEVER)極其不常用
    MANDATORY拋出異常融合到外部事物中@Transactional(propagation = Propagation.MANDATORY)極其不常用

    Spring 中傳播屬性的默認(rèn)值是:REQUIRED

    推薦傳播屬性的使用方式:

    • 增刪改 方法:使用默認(rèn)值 REQUIRED
    • 查詢 方法:顯示指定傳播屬性的值為 SUPPORTS

    只讀屬性(readOnly)

    針對(duì)于?只進(jìn)行查詢操作的業(yè)務(wù)方法,可以加入只讀屬性,提高運(yùn)行效率。
    默認(rèn)值:false

    @Transactional(readOnly = true)

    超時(shí)屬性(timeout)

    指定了事務(wù)等待的最長(zhǎng)時(shí)間。

  • 為什么事務(wù)會(huì)進(jìn)行等待?
    當(dāng)前事務(wù)訪問數(shù)據(jù)時(shí),有可能訪問的數(shù)據(jù)被別的事務(wù)進(jìn)行加鎖的處理,那么此時(shí)本事務(wù)就必須進(jìn)行等待。
  • 等待時(shí)間,單位是?
  • 如何使用:@Transactional(timeout = 2)
  • 超時(shí)屬性的默認(rèn)值:-1
    -1 表示超時(shí)屬性由對(duì)應(yīng)的數(shù)據(jù)庫來指定(一般不會(huì)主動(dòng)指定,-1 即可)
  • 異常屬性

    Spring 事務(wù)處理過程中:

    • 默認(rèn)對(duì)于?RuntimeException?及其子類,采用?回滾?的策略。
    • 默認(rèn)對(duì)于?Exception?及其子類,采用?提交?的策略。

    使用方法:

    @Transactional(rollbackFor = java.lang.Exception.class, xxx, xxx)@Transactional(noRollbackFor = java.lang.RuntimeException, xxx, xxx)

    建議:實(shí)戰(zhàn)中使用?RuntimeException?及其子類,使用事務(wù)異常屬性的默認(rèn)值。

    事務(wù)屬性常見配置總結(jié)

  • 隔離屬性 默認(rèn)值
  • 傳播屬性 Required(默認(rèn)值)增刪改、Supports 查詢操作
  • 只讀屬性 readOnly=false 增刪改,true 查詢操作
  • 超時(shí)屬性 默認(rèn)值 -1
  • 異常屬性 默認(rèn)值
  • 增刪改操作:@Transactional
    查詢操作:@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)

    基于標(biāo)簽的事務(wù)配置方式

    基于注解?@Transaction?的事務(wù)配置回顧:

    <bean id="userService" class="com.yusael.service.UserServiceImpl"><property name="userDAO" ref="userDAO"/> </bean><!--DataSourceTransactionManager--> <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/> </bean>@Transactional public class UserServiceImpl implements UserService {private UserDAO userDAO;<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>

    基于標(biāo)簽的事務(wù)配置:

    <!--DataSourceTransactionManager--> <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/> </bean><tx:advice id="txAdvice" transaction-manager="dataSourceTransactionManager"><tx:attributes><tx:method name="register" isolation="DEFAULT" propagation="REQUIRED"/></tx:attributes> </tx:advice><aop:config><aop:pointcut id="pc" expression="execution(* com.yusael.service.UserServiceImpl.register(..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/> </aop:config>

    基于標(biāo)簽的事務(wù)配置在?實(shí)戰(zhàn)?中的應(yīng)用方式:

    <tx:advice id="txAdvice" transaction-manager="dataSourceTransactionManager"><tx:attributes><tx:method name="register"/><tx:method name="modify*"/>編程時(shí)候, service中負(fù)責(zé)進(jìn)行增刪改操作的方法 都以 modify 開頭查詢操作 命名無所謂<tx:method name="*" propagation="SUPPORTS" read-only="true"/></tx:attributes> </tx:advice><aop:config><aop:pointcut id="pc" expression="execution(* com.yusael.service..*.*(..))"/>應(yīng)用的過程中, 將 service 都放到 service 包下<aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/> </aop:config> 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

    總結(jié)

    以上是生活随笔為你收集整理的(九)Spring 事务开发、事务属性详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。