日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Spring事務管理—快速入門

來源: 責編: 時間:2023-10-08 09:59:49 254觀看
導讀先來講講臟讀 不可重復讀 和 幻讀。臟讀:我們在并發編程中是很熟悉的,通俗的講就是你讀得數據已經被修改了,已經過時失去意義了。不可重復讀: 同一個事務里面多次讀取同一行數據,卻返回不同的結果。幻讀:同樣一筆查詢在整

nVY28資訊網——每日最新資訊28at.com

先來講講臟讀 不可重復讀 和 幻讀。nVY28資訊網——每日最新資訊28at.com

  • 臟讀:我們在并發編程中是很熟悉的,通俗的講就是你讀得數據已經被修改了,已經過時失去意義了。
  • 不可重復讀: 同一個事務里面多次讀取同一行數據,卻返回不同的結果。
  • 幻讀:同樣一筆查詢在整個事務過程中多次執行后,查詢所得的結果集不一樣。

事務四大特性 ACID

1、原子性(Atomicity)

要求事務所包含的全部操作是一個不可分割的整體,如果有一步發生異常,則全部不提交。nVY28資訊網——每日最新資訊28at.com

2、一致性(Consistency)

A給B轉錢,A減和B增這兩個操作必須保持一致。nVY28資訊網——每日最新資訊28at.com

3、隔離性(Isolation)

事務會將一部分數據與其他事務隔離,防止臟讀等。nVY28資訊網——每日最新資訊28at.com

4、持久性(Durability)

事務的結果被寫到持久化存儲器中。nVY28資訊網——每日最新資訊28at.com

事務四大隔離級別

隔離級別越高,則性能相對越低,反之亦然。nVY28資訊網——每日最新資訊28at.com

1、Read Uncommitted

最低的隔離級別,跟你直譯的意思一樣:可以讀取其它事務未完成的結果。(臟讀)nVY28資訊網——每日最新資訊28at.com

很明顯,臟讀 不可重復讀 和 幻讀這三個問題它都有。nVY28資訊網——每日最新資訊28at.com

2、Read Committed

大部分數據庫采用的默認隔離級別,比上一個隔離級別多了限定:在該事務完成后,才能讀取該事務的數據更新后的結果。nVY28資訊網——每日最新資訊28at.com

它可以避免臟讀,但是也有不可重復讀取和幻讀的問題。nVY28資訊網——每日最新資訊28at.com

3、Repeatable Read

可以保證在整個事務的過程中,對同一筆數據的讀取結果是相同的,不管其他事務是否同時在對同一筆數據進行更新,也不管其他事務對同一筆數 據的更新提交與否。nVY28資訊網——每日最新資訊28at.com

Repeatable Read隔離級別避免了臟讀和不可重復讀取的問題,但無法避免幻讀。nVY28資訊網——每日最新資訊28at.com

4、Serializable

最為嚴格的隔離級別,所有的事務操作都必須依次順序執行,可以避免其他隔離級別遇到的所有問題,是最為安全的隔離級別, 但同時也是性能最差的隔離級別。nVY28資訊網——每日最新資訊28at.com

通常情況下,我們會使用其他隔離級別加上相應的并發鎖的機制來控制對數據的訪問,這樣既保證 了系統性能不會損失太大,也能夠一定程度上保證數據的一致性。nVY28資訊網——每日最新資訊28at.com

Spring事務傳播機制

事務傳播行為nVY28資訊網——每日最新資訊28at.com

含義nVY28資訊網——每日最新資訊28at.com

PROPAGATION_REQUIRED(默認)nVY28資訊網——每日最新資訊28at.com

必須在事務中執行,如果沒有,就新new一個新事務nVY28資訊網——每日最新資訊28at.com

PROPAGATION_SUPPORTSnVY28資訊網——每日最新資訊28at.com

誰調用我我就在誰的事務中執行,沒有的話就沒有nVY28資訊網——每日最新資訊28at.com

PROPAGATION_MANDATORYnVY28資訊網——每日最新資訊28at.com

必須要有事務,沒有就報錯nVY28資訊網——每日最新資訊28at.com

PROPAGATION_REQUIRED_NEWnVY28資訊網——每日最新資訊28at.com

不管調用我的方法有沒有事務,我都new一個事務nVY28資訊網——每日最新資訊28at.com

PROPAGATION_NOT_SUPPORTEDnVY28資訊網——每日最新資訊28at.com

調用我的方法有事務,但我不在事務中執行nVY28資訊網——每日最新資訊28at.com

PROPAGATION_NEVERnVY28資訊網——每日最新資訊28at.com

不允許在事務中運行,有事務則報錯nVY28資訊網——每日最新資訊28at.com

PROPAGATION_NESTEDnVY28資訊網——每日最新資訊28at.com

有事務則嵌套,沒有則new一個新事務nVY28資訊網——每日最新資訊28at.com

從JDBC的事務說起

我們都知道,JDBC給我們提供了事務。nVY28資訊網——每日最新資訊28at.com

try{     con.setAutoCommit(false);//開啟事務     ......     con.commit();//try的最后提交事務      } catch() {    con.rollback();//回滾事務}

獲取事務隔離級別。nVY28資訊網——每日最新資訊28at.com

Connection.getTransactionIsolation()

設置事務隔離級別。nVY28資訊網——每日最新資訊28at.com

con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);

Spring事務機制

Spring并不會直接管理事務,而是提供了事務管理器,將事務管理的職責委托給JPA JDBC JTA DataSourceTransaction JMSTransactionManager 等框架提供的事務來實現。nVY28資訊網——每日最新資訊28at.com

那么,Spring提供的事務管理器是什么呢?nVY28資訊網——每日最新資訊28at.com


PlatformTransactionManager.java接口:
nVY28資訊網——每日最新資訊28at.com

PlatformTransactionManager.java

Spring提供的事務管理器。不同的事務遵循該事務管理器的API,便能很輕松的交給Spring管理。nVY28資訊網——每日最新資訊28at.com

public interface PlatformTransactionManager {    // 通過Transation定義 獲取Transation    TransactionStatus getTransaction(@Nullable TransactionDefinition var1) throws TransactionException;    // 提交事務    void commit(TransactionStatus var1) throws TransactionException;    // 回滾事務    void rollback(TransactionStatus var1) throws TransactionException;}

可以看到它里面引用到了TransactionDefinition和TransactionStatus。nVY28資訊網——每日最新資訊28at.com

TransactionDefinition.java

它里面包含了事務的定義。nVY28資訊網——每日最新資訊28at.com

public interface TransactionDefinition {    // 傳播機制    int PROPAGATION_REQUIRED = 0;    int PROPAGATION_SUPPORTS = 1;    int PROPAGATION_MANDATORY = 2;    int PROPAGATION_REQUIRES_NEW = 3;    int PROPAGATION_NOT_SUPPORTED = 4;    int PROPAGATION_NEVER = 5;    int PROPAGATION_NESTED = 6;    // 隔離級別    int ISOLATION_DEFAULT = -1;    int ISOLATION_READ_UNCOMMITTED = 1;    int ISOLATION_READ_COMMITTED = 2;    int ISOLATION_REPEATABLE_READ = 4;    int ISOLATION_SERIALIZABLE = 8;    int TIMEOUT_DEFAULT = -1;    int getPropagationBehavior();    // 獲取隔離級別    int getIsolationLevel();    int getTimeout();        boolean isReadOnly();    @Nullable    String getName();}

TransactionStatus.java

事務的狀態。nVY28資訊網——每日最新資訊28at.com

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

Spring默認事務使用

1、代碼方式使用

@Autowiredprivate PlatformTransactionManager transactionManager;public void testTX(){    DefaultTransactionDefinition definition = new DefaultTransactionDefinition();    TransactionStatus status = transactionManager.getTransaction(definition);    try {        // 業務邏輯        // ...                // 提交事務        transactionManager.commit(status);    }catch (Exception e){        // 發生異常,事務回滾        transactionManager.rollback(status);    }}

2、注解方式使用

@Transactionalvoid testTX2(){    // 業務邏輯 ...}

這不是玄學,它的底層是依靠AOP動態代理實現,其實重新渲染出的代碼和第一個使用方式類似,不過大大減少了開發復雜度。nVY28資訊網——每日最新資訊28at.com

擴展:@Transactional注解

@Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Inherited@Documentedpublic @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 -1;    // 讀寫或只讀事務,默認讀寫    boolean readOnly() default false;    // 導致事務回滾的異常類數組     Class<? extends Throwable>[] rollbackFor() default {};    // 導致事務回滾的異常類名字數組    String[] rollbackForClassName() default {};    // 不會導致事務回滾的異常類數組    Class<? extends Throwable>[] noRollbackFor() default {};    // 不會導致事務回滾的異常類名字數組    String[] noRollbackForClassName() default {};}

Spring事務實踐

非入門選手下面的demo可能會引起你的不適(浪費時間)。
假設我要完成一個功能,當刪除用戶的時候,將與該用戶有關的所有數據行都刪除。nVY28資訊網——每日最新資訊28at.com

public void delUser(Integer userId) {    // 刪除和用戶相關的信息     otherRepository.deleteByUserId(userId);     // 刪除用戶     userRepository.deleteById(userId);}

這樣的寫法一般來講,會成功的完成任務。但是如果這樣一段代碼:nVY28資訊網——每日最新資訊28at.com

public void delUser(Integer userId) {    // 刪除和用戶相關的信息    otherRepository.deleteByUserId();    if (true) {        throw new RuntimeException("xxx");    }    // 刪除用戶     userRepository.deleteById(userId);}

結果會是:deleteByUserId()執行成功,deleteById()執行失敗,不滿足數據的一致性。nVY28資訊網——每日最新資訊28at.com

所以我們需要事務來限制:要么全部執行,要么全部不執行(方法中有異常就自動回滾)。那怎么實現呢,只需要在方法上加一個注解:@TransactionalnVY28資訊網——每日最新資訊28at.com

@Transactionalpublic void delUser(Integer userId) {    // 刪除和用戶相關的信息    otherRepository.deleteByUserId();    if (true) {        throw new RuntimeException("xxx");    }    // 刪除用戶     userRepository.deleteById(userId);}

Spring 加載第三方事務管理

比如我有個需求(接著上次的強票系統II),要求信息不能丟失,要用到RabbitMQ的事務管理,那怎么去加載到Spring的事務管理器中呢?nVY28資訊網——每日最新資訊28at.com

@Beanpublic ConnectionFactory connectionFactory() {    CachingConnectionFactory connectionFactory = new CachingConnectionFactory();    return connectionFactory;}@Beanpublic RabbitTransactionManager rabbitTransactionManager(ConnectionFactory connectionFactory) {    return new RabbitTransactionManager(connectionFactory);}

我們只需要這樣做便可以使的使用@Transactional注解來實現對RabbitMQ的事務管理,其它框架也類似。nVY28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-12417-0.htmlSpring事務管理—快速入門

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 詳解Spring多線程下如何保證事務的一致性

下一篇: HTTP協議揭秘:探尋互聯網的背后密碼、探秘數據傳輸的奧秘

標簽:
  • 熱門焦點
  • Golang 中的 io 包詳解:組合接口

    io.ReadWriter// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}是對Reader和Writer接口的組合,
  • 如何正確使用:Has和:Nth-Last-Child

    我們可以用CSS檢查,以了解一組元素的數量是否小于或等于一個數字。例如,一個擁有三個或更多子項的grid。你可能會想,為什么需要這樣做呢?在某些情況下,一個組件或一個布局可能會
  • 一文掌握 Golang 模糊測試(Fuzz Testing)

    模糊測試(Fuzz Testing)模糊測試(Fuzz Testing)是通過向目標系統提供非預期的輸入并監視異常結果來發現軟件漏洞的方法。可以用來發現應用程序、操作系統和網絡協議等中的漏洞或
  • 2023年,我眼中的字節跳動

    此時此刻(2023年7月),字節跳動從未上市,也從未公布過任何官方的上市計劃;但是這并不妨礙它成為中國最受關注的互聯網公司之一。從2016-17年的抖音強勢崛起,到2018年的&ldquo;頭騰
  • 品牌洞察丨服務本地,美團直播成效幾何?

    來源:17PR7月11日,美團App首頁推薦位出現&ldquo;美團直播&rdquo;的固定入口。在直播聚合頁面,外賣&ldquo;神槍手&rdquo;直播間、美團旅行直播間、美團買菜直播間等均已上線,同時
  • 大廠卷向扁平化

    來源:新熵作者丨南枝 編輯丨月見大廠職級不香了。俗話說,兵無常勢,水無常形,互聯網企業調整職級體系并不稀奇。7月13日,淘寶天貓集團啟動了近年來最大的人力制度改革,目前已形成一
  • 認真聊聊東方甄選:如何告別低垂的果實

    來源:山核桃作者:財經無忌爆火一年后,俞敏洪和他的東方甄選依舊是頗受外界關心的&ldquo;網紅&rdquo;。7月5日至9日,為期5天的東方甄選&ldquo;甘肅行&rdquo;首次在自有App內直播,
  • 華為Mate 60保護殼曝光:碩大后置相機模組 凸起程度有驚喜

    這段時間以來,關于華為新旗艦的爆料日漸密集。據此前多方爆料,今年華為將開始恢復一年雙旗艦戰略,除上半年推出的P60系列外,往年下半年的Mate系列也將
  • OPPO K11評測:旗艦級IMX890加持 2000元檔最強影像手機

    【Techweb評測】中端機型用戶群體巨大,占了中國目前手機市場的大頭,一直以來都是各手機品牌的“必爭之地”,其中OPPO K系列機型一直以來都以高品質、
Top 主站蜘蛛池模板: 云龙县| 濉溪县| 开原市| 钦州市| 合作市| 荥经县| 通山县| 嘉善县| 平安县| 濮阳县| 渭南市| 新蔡县| 甘德县| 阳曲县| 柳州市| 新津县| 迁西县| 林甸县| 三门峡市| 拉萨市| 禄劝| 保定市| 河西区| 巴彦淖尔市| 紫阳县| 西乡县| 茶陵县| 南汇区| 五指山市| 沙坪坝区| 瑞丽市| 虹口区| 安国市| 揭西县| 浦江县| 常德市| 墨竹工卡县| 简阳市| 青河县| 泰州市| 临颍县|