久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

(十二)Spring從入門到入土——Spring事務(wù)

 小樣樣樣樣樣樣 2021-05-21

Spring事務(wù)

事務(wù)是邏輯上的一組操作,要么都執(zhí)行,,要么都不執(zhí)行

事務(wù)的特性(ACID)

  • 原子性

  • 一致性

  • 隔離性

  • 持久性

Spring管理事務(wù)的方式有幾種

程序是否支持事務(wù)是取決于數(shù)據(jù)庫是否支持事務(wù)

MySQL是如何保證原子性的:

恢復(fù)機(jī)制是依賴回滾日志實(shí)現(xiàn)的

  • 編程式事務(wù),,在代碼中硬編碼(不推薦使用)

  • 聲明式事務(wù),,在配置文件中配置(推薦使用),代碼侵入性小,,通過AOP實(shí)現(xiàn)

    • 基于XML的聲明式事務(wù)

    • 基于注解的聲明式事務(wù)

Spring事務(wù)管理接口介紹

Spring中事務(wù)管理相關(guān)的最重要的三個(gè)接口如下

  • PlatformTransactionManager:(平臺(tái))事務(wù)管理器,,Spring事務(wù)策略的核心(上層管理者)

  • TransactionDefinition:事務(wù)定義信息(事務(wù)隔離級(jí)別、傳播行為,、超時(shí),、只讀、回滾規(guī)則)

  • TransactionStatus:事務(wù)運(yùn)行狀態(tài)

PlatformTransactionManager:事務(wù)管理接口

Spring并不直接管理事務(wù),,而是提供了多種事務(wù)管理器,。spring通過該事務(wù)管理接口為多個(gè)平臺(tái)提供了對(duì)應(yīng)的事務(wù)管理器,具體的實(shí)現(xiàn)就是各個(gè)平臺(tái)自己的事情了,。

該接口主要是將事務(wù)管理行為抽象出來,,然后不同的平臺(tái)去實(shí)現(xiàn)它,,可以保證提供給外部的行為不變,方便我們擴(kuò)展,。

TransactionDefinition:事務(wù)屬性

該類定義了一些基本的事務(wù)屬性,。

  • 事務(wù)屬性包括了五個(gè)方面

    • 隔離級(jí)別

    • 傳播行為

    • 回滾規(guī)則

    • 是否只讀

    • 事務(wù)超時(shí)

TransactionStatus:事務(wù)狀態(tài)

該接口用來記錄事務(wù)的狀態(tài),該接口定義了一組方法,,用來獲取或判斷事務(wù)的相應(yīng)狀態(tài)信息,。

public interface TransactionStatus{
    boolean isNewTransaction(); // 是否是新的事務(wù)
    boolean hasSavepoint(); // 是否有恢復(fù)點(diǎn)
    void setRollbackOnly();  // 設(shè)置為只回滾
    boolean isRollbackOnly(); // 是否為只回滾
    boolean isCompleted; // 是否已完成
}

事務(wù)屬性詳解

Spring事務(wù)傳播行為(枚舉類:Propagation)

事務(wù)傳播行為是為了解決業(yè)務(wù)層之間互相調(diào)用的事務(wù)問題。

當(dāng)事務(wù)方法被另一個(gè)事務(wù)方法調(diào)用時(shí),,必須制定事務(wù)應(yīng)該如何傳播,。例如:方法可能繼續(xù)在現(xiàn)有的事務(wù)中運(yùn)行,也可能開啟一個(gè)新事務(wù),,并在自己的事務(wù)中運(yùn)行,。

事務(wù)傳播行為類型說明是否支持當(dāng)前事務(wù)
REQUIRED如果當(dāng)前存在事務(wù),則加入該事務(wù),;如果當(dāng)前沒有事務(wù),,則創(chuàng)建一個(gè)新的事務(wù)。(默認(rèn)情況)?
SUPPORTS如果當(dāng)前存在事務(wù),,則加入該事務(wù),;如果當(dāng)前沒有事務(wù),則以非事務(wù)的方式繼續(xù)運(yùn)行,。?
MANDATORY如果當(dāng)前存在事務(wù),,則加入該事務(wù);如果當(dāng)前沒有事務(wù),,則拋出異常,。(mandatory:強(qiáng)制性)?
REQUIRES_NEW創(chuàng)建一個(gè)新的事務(wù),如果當(dāng)前存在事務(wù),,則把當(dāng)前事務(wù)掛起,。?
NOT_SUPPORTED**以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),,則把當(dāng)前事務(wù)掛起,。?
NEVER以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),,則拋出異常,。?
NESTED如果當(dāng)前存在事務(wù),則創(chuàng)建一個(gè)事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來運(yùn)行,;如果當(dāng)前沒有事務(wù),,則該取值等價(jià)于REQUIRED。?

Spring事務(wù)中的隔離級(jí)別(枚舉類:Isolation)

TransactionDefinition接口中定義了五個(gè)表示隔離級(jí)別的常量,。

  • ISOLATION_DEFAULT: 后端數(shù)據(jù)庫默認(rèn)的隔離級(jí)別,,Mysql 默認(rèn)采用的 REPEATABLE_READ隔離級(jí)別 Oracle 默認(rèn)采用的 READ_COMMITTED隔離級(jí)別.

  • ISOLATION_READ_UNCOMMITTED: 最低的隔離級(jí)別,,允許讀取尚未提交的數(shù)據(jù)變更,可能會(huì)導(dǎo)致臟讀,、幻讀或不可重復(fù)讀

  • ISOLATION_READ_COMMITTED: 允許讀取并發(fā)事務(wù)已經(jīng)提交的數(shù)據(jù),,可以阻止臟讀,但是幻讀或不可重復(fù)讀仍有可能發(fā)生

  • ISOLATION_REPEATABLE_READ: 對(duì)同一字段的多次讀取結(jié)果都是一致的,,除非數(shù)據(jù)是被本身事務(wù)自己所修改,,可以阻止臟讀和不可重復(fù)讀,但幻讀仍有可能發(fā)生,。

  • ISOLATION_SERIALIZABLE: 最高的隔離級(jí)別,,完全服從ACID的隔離級(jí)別。所有的事務(wù)依次逐個(gè)執(zhí)行,,這樣事務(wù)之間就完全不可能產(chǎn)生干擾,,也就是說,該級(jí)別可以防止臟讀,、不可重復(fù)讀以及幻讀,。但是這將嚴(yán)重影響程序的性能,。通常情況下也不會(huì)用到該級(jí)別,。

事務(wù)超時(shí)屬性

所謂事務(wù)超時(shí),就是指一個(gè)事務(wù)所允許執(zhí)行的最長(zhǎng)時(shí)間,,如果超過該時(shí)間限制但事務(wù)還沒有完成,,則自動(dòng)回滾事務(wù)。在TransactionDefinition中以int的值來表示超時(shí)時(shí)間,,其單位是秒,,默認(rèn)值是-1

事務(wù)只讀屬性

對(duì)于只有讀取數(shù)據(jù)查詢的事務(wù),可以指定事務(wù)類型為readonly,,即只讀屬性,。只讀事務(wù)不涉及數(shù)據(jù)的修改,數(shù)據(jù)庫會(huì)提供一些優(yōu)化手段,,適合用在有多條數(shù)據(jù)庫查詢操作的方法中,。

MySQL默認(rèn)對(duì)每一個(gè)新建立的連接都啟用了autocommit模式,在該模式下,,每一個(gè)發(fā)送到MySQL服務(wù)器的sql語句都會(huì)在一個(gè)單獨(dú)的事務(wù)中處理,,執(zhí)行結(jié)束后會(huì)自動(dòng)提交事務(wù),并開啟一個(gè)新事務(wù),。

如果不加Transaction,,每條sql會(huì)開啟一個(gè)單獨(dú)的事務(wù),中間被其他事務(wù)改了數(shù)據(jù),,都會(huì)實(shí)時(shí)讀取到最新值,。

如果你一次執(zhí)行多條查詢語句,,例如統(tǒng)計(jì)查詢,報(bào)表查詢,,在這種場(chǎng)景下,,多條查詢 SQL 必須保證整體的讀一致性,否則,,在前條 SQL 查詢之后,,后條 SQL 查詢之前,數(shù)據(jù)被其他用戶改變,,則該次整體的統(tǒng)計(jì)查詢將會(huì)出現(xiàn)讀數(shù)據(jù)不一致的狀態(tài),,此時(shí),應(yīng)該啟用事務(wù)支持

事務(wù)回滾規(guī)則

這些規(guī)則定義了那些異常會(huì)導(dǎo)致事務(wù)回滾而那些不會(huì),。默認(rèn)情況下,,事務(wù)只有遇到了運(yùn)行時(shí)異常(RuntimeException的子類)時(shí)才會(huì)回滾,Error也會(huì)導(dǎo)致事務(wù)回滾,,但是在遇到檢查型(Checked)異常時(shí)不會(huì)回滾,。

如果要定義你回滾的異常類型可以這樣

@Transactional(rollbackFor = MyException.class)

@Transaction注解

作用范圍

  • 方法:推薦將注解使用在方法上,不過需要注意的是,,該注解只能應(yīng)用到public方法上,,否則不生效

  • 類:如果定義在類上,說明對(duì)該類中的所有public方法有有效

  • 接口:不推薦在接口上使用

常用配置參數(shù)

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {

    @AliasFor("transactionManager")
    String value() default "";

    @AliasFor("value")
    String transactionManager() default "";

    Propagation propagation() default Propagation.REQUIRED;

    Isolation isolation() default Isolation.DEFAULT;

    int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;

    boolean readOnly() default false;

    Class<? extends Throwable>[] rollbackFor() default {};

    String[] rollbackForClassName() default {};

    Class<? extends Throwable>[] noRollbackFor() default {};

    String[] noRollbackForClassName() default {};

}

@Transactional的常用配置參數(shù)總結(jié)

屬性名說明
propagation事務(wù)的傳播方式,,默認(rèn)REQUIRED
isolation事務(wù)的隔離級(jí)別,,默認(rèn)DEFAULT
timeout事務(wù)超時(shí)時(shí)間,默認(rèn)-1(不會(huì)超時(shí)),。如果超過時(shí)間限制沒有完成,,則自動(dòng)回滾
readOnly指定事務(wù)是否只讀,默認(rèn)為false
rollbackFor用于指定能夠觸發(fā)事務(wù)回滾的異常類型,,并且可以指定多個(gè)異常類型

@Transaction事務(wù)注解原理

@Transaction的工作機(jī)制是基于AOP實(shí)現(xiàn)的,,AOP有事使用動(dòng)態(tài)代理實(shí)現(xiàn)的。如果目標(biāo)對(duì)象實(shí)現(xiàn)了接口,,默認(rèn)情況下采用JDK的動(dòng)態(tài)代理,,如果對(duì)象沒有實(shí)現(xiàn)接口,會(huì)使用Cglib來做動(dòng)態(tài)代理

createAopProxy()方法決定了使用JDK還是Cglib來做動(dòng)態(tài)代理

如果一個(gè)類或者一個(gè)類中的public方法上被標(biāo)注@Transaction注解的話,,Spring容器會(huì)在啟動(dòng)的時(shí)候?yàn)槠鋭?chuàng)建一個(gè)代理類,,在調(diào)用被@Transaction注解的public方法的時(shí)候,實(shí)際調(diào)用的是TransactionInterceptor類中的invoke方法,。這個(gè)方法的作用就是在目標(biāo)方法之前開啟事務(wù),,方法執(zhí)行過程中如果遇到異常的時(shí)候回滾事務(wù),方法調(diào)用完成后提交事務(wù),。

注解失效情況

應(yīng)用在非public修飾的方法上

Spring AOP自調(diào)用問題

若同一類中的其他沒有@Transaction注解的方法內(nèi)部調(diào)用有@Transaction注解的方法,,有@Transaction注解的方法的事務(wù)會(huì)失效,。

這是由于Spring AOP代理的原因造成的,因?yàn)橹挥蠤Transaction注解的方法在類以外被調(diào)用的時(shí)候,,Spring事務(wù)管理才生效,。

解決方法就是避免同一類中自調(diào)用或者使用AspectJ取代Spring AOP代理。

propagation屬性設(shè)置錯(cuò)誤

rollbackFor屬性設(shè)置錯(cuò)誤

try/catch中沒有拋出異常導(dǎo)致失效

數(shù)據(jù)庫不支持事務(wù)

最后

  • 如果覺得看完有收獲,,希望能給我點(diǎn)個(gè)贊,,這將會(huì)是我更新的最大動(dòng)力,感謝各位的支持

  • 歡迎各位關(guān)注我的公眾號(hào)【java冢狐】,,專注于java和計(jì)算機(jī)基礎(chǔ)知識(shí),,保證讓你看完有所收獲,不信你打我

  • 如果看完有不同的意見或者建議,,歡迎多多評(píng)論一起交流,。感謝各位的支持以及厚愛。

——我是冢狐,,和你一樣熱愛編程,。

image

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多