AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁(yè) > 科技  > 軟件

Spring事務(wù)管理—快速入門(mén)

來(lái)源: 責(zé)編: 時(shí)間:2023-10-08 09:59:49 258觀看
導(dǎo)讀先來(lái)講講臟讀 不可重復(fù)讀 和 幻讀。臟讀:我們?cè)诓l(fā)編程中是很熟悉的,通俗的講就是你讀得數(shù)據(jù)已經(jīng)被修改了,已經(jīng)過(guò)時(shí)失去意義了。不可重復(fù)讀: 同一個(gè)事務(wù)里面多次讀取同一行數(shù)據(jù),卻返回不同的結(jié)果。幻讀:同樣一筆查詢?cè)谡?/div>

v2928資訊網(wǎng)——每日最新資訊28at.com

先來(lái)講講臟讀 不可重復(fù)讀 和 幻讀。v2928資訊網(wǎng)——每日最新資訊28at.com

  • 臟讀:我們?cè)诓l(fā)編程中是很熟悉的,通俗的講就是你讀得數(shù)據(jù)已經(jīng)被修改了,已經(jīng)過(guò)時(shí)失去意義了。
  • 不可重復(fù)讀: 同一個(gè)事務(wù)里面多次讀取同一行數(shù)據(jù),卻返回不同的結(jié)果。
  • 幻讀:同樣一筆查詢?cè)谡麄€(gè)事務(wù)過(guò)程中多次執(zhí)行后,查詢所得的結(jié)果集不一樣。

事務(wù)四大特性 ACID

1、原子性(Atomicity)

要求事務(wù)所包含的全部操作是一個(gè)不可分割的整體,如果有一步發(fā)生異常,則全部不提交。v2928資訊網(wǎng)——每日最新資訊28at.com

2、一致性(Consistency)

A給B轉(zhuǎn)錢(qián),A減和B增這兩個(gè)操作必須保持一致。v2928資訊網(wǎng)——每日最新資訊28at.com

3、隔離性(Isolation)

事務(wù)會(huì)將一部分?jǐn)?shù)據(jù)與其他事務(wù)隔離,防止臟讀等。v2928資訊網(wǎng)——每日最新資訊28at.com

4、持久性(Durability)

事務(wù)的結(jié)果被寫(xiě)到持久化存儲(chǔ)器中。v2928資訊網(wǎng)——每日最新資訊28at.com

事務(wù)四大隔離級(jí)別

隔離級(jí)別越高,則性能相對(duì)越低,反之亦然。v2928資訊網(wǎng)——每日最新資訊28at.com

1、Read Uncommitted

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

很明顯,臟讀 不可重復(fù)讀 和 幻讀這三個(gè)問(wèn)題它都有。v2928資訊網(wǎng)——每日最新資訊28at.com

2、Read Committed

大部分?jǐn)?shù)據(jù)庫(kù)采用的默認(rèn)隔離級(jí)別,比上一個(gè)隔離級(jí)別多了限定:在該事務(wù)完成后,才能讀取該事務(wù)的數(shù)據(jù)更新后的結(jié)果。v2928資訊網(wǎng)——每日最新資訊28at.com

它可以避免臟讀,但是也有不可重復(fù)讀取和幻讀的問(wèn)題。v2928資訊網(wǎng)——每日最新資訊28at.com

3、Repeatable Read

可以保證在整個(gè)事務(wù)的過(guò)程中,對(duì)同一筆數(shù)據(jù)的讀取結(jié)果是相同的,不管其他事務(wù)是否同時(shí)在對(duì)同一筆數(shù)據(jù)進(jìn)行更新,也不管其他事務(wù)對(duì)同一筆數(shù) 據(jù)的更新提交與否。v2928資訊網(wǎng)——每日最新資訊28at.com

Repeatable Read隔離級(jí)別避免了臟讀和不可重復(fù)讀取的問(wèn)題,但無(wú)法避免幻讀。v2928資訊網(wǎng)——每日最新資訊28at.com

4、Serializable

最為嚴(yán)格的隔離級(jí)別,所有的事務(wù)操作都必須依次順序執(zhí)行,可以避免其他隔離級(jí)別遇到的所有問(wèn)題,是最為安全的隔離級(jí)別, 但同時(shí)也是性能最差的隔離級(jí)別。v2928資訊網(wǎng)——每日最新資訊28at.com

通常情況下,我們會(huì)使用其他隔離級(jí)別加上相應(yīng)的并發(fā)鎖的機(jī)制來(lái)控制對(duì)數(shù)據(jù)的訪問(wèn),這樣既保證 了系統(tǒng)性能不會(huì)損失太大,也能夠一定程度上保證數(shù)據(jù)的一致性。v2928資訊網(wǎng)——每日最新資訊28at.com

Spring事務(wù)傳播機(jī)制

事務(wù)傳播行為v2928資訊網(wǎng)——每日最新資訊28at.com

含義v2928資訊網(wǎng)——每日最新資訊28at.com

PROPAGATION_REQUIRED(默認(rèn))v2928資訊網(wǎng)——每日最新資訊28at.com

必須在事務(wù)中執(zhí)行,如果沒(méi)有,就新new一個(gè)新事務(wù)v2928資訊網(wǎng)——每日最新資訊28at.com

PROPAGATION_SUPPORTSv2928資訊網(wǎng)——每日最新資訊28at.com

誰(shuí)調(diào)用我我就在誰(shuí)的事務(wù)中執(zhí)行,沒(méi)有的話就沒(méi)有v2928資訊網(wǎng)——每日最新資訊28at.com

PROPAGATION_MANDATORYv2928資訊網(wǎng)——每日最新資訊28at.com

必須要有事務(wù),沒(méi)有就報(bào)錯(cuò)v2928資訊網(wǎng)——每日最新資訊28at.com

PROPAGATION_REQUIRED_NEWv2928資訊網(wǎng)——每日最新資訊28at.com

不管調(diào)用我的方法有沒(méi)有事務(wù),我都new一個(gè)事務(wù)v2928資訊網(wǎng)——每日最新資訊28at.com

PROPAGATION_NOT_SUPPORTEDv2928資訊網(wǎng)——每日最新資訊28at.com

調(diào)用我的方法有事務(wù),但我不在事務(wù)中執(zhí)行v2928資訊網(wǎng)——每日最新資訊28at.com

PROPAGATION_NEVERv2928資訊網(wǎng)——每日最新資訊28at.com

不允許在事務(wù)中運(yùn)行,有事務(wù)則報(bào)錯(cuò)v2928資訊網(wǎng)——每日最新資訊28at.com

PROPAGATION_NESTEDv2928資訊網(wǎng)——每日最新資訊28at.com

有事務(wù)則嵌套,沒(méi)有則new一個(gè)新事務(wù)v2928資訊網(wǎng)——每日最新資訊28at.com

從JDBC的事務(wù)說(shuō)起

我們都知道,JDBC給我們提供了事務(wù)。v2928資訊網(wǎng)——每日最新資訊28at.com

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

獲取事務(wù)隔離級(jí)別。v2928資訊網(wǎng)——每日最新資訊28at.com

Connection.getTransactionIsolation()

設(shè)置事務(wù)隔離級(jí)別。v2928資訊網(wǎng)——每日最新資訊28at.com

con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);

Spring事務(wù)機(jī)制

Spring并不會(huì)直接管理事務(wù),而是提供了事務(wù)管理器,將事務(wù)管理的職責(zé)委托給JPA JDBC JTA DataSourceTransaction JMSTransactionManager 等框架提供的事務(wù)來(lái)實(shí)現(xiàn)。v2928資訊網(wǎng)——每日最新資訊28at.com

那么,Spring提供的事務(wù)管理器是什么呢?v2928資訊網(wǎng)——每日最新資訊28at.com


PlatformTransactionManager.java接口:
v2928資訊網(wǎng)——每日最新資訊28at.com

PlatformTransactionManager.java

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

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

可以看到它里面引用到了TransactionDefinition和TransactionStatus。v2928資訊網(wǎng)——每日最新資訊28at.com

TransactionDefinition.java

它里面包含了事務(wù)的定義。v2928資訊網(wǎng)——每日最新資訊28at.com

public interface TransactionDefinition {    // 傳播機(jī)制    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;    // 隔離級(jí)別    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();    // 獲取隔離級(jí)別    int getIsolationLevel();    int getTimeout();        boolean isReadOnly();    @Nullable    String getName();}

TransactionStatus.java

事務(wù)的狀態(tài)。v2928資訊網(wǎng)——每日最新資訊28at.com

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

Spring默認(rèn)事務(wù)使用

1、代碼方式使用

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

2、注解方式使用

@Transactionalvoid testTX2(){    // 業(yè)務(wù)邏輯 ...}

這不是玄學(xué),它的底層是依靠AOP動(dòng)態(tài)代理實(shí)現(xiàn),其實(shí)重新渲染出的代碼和第一個(gè)使用方式類(lèi)似,不過(guò)大大減少了開(kāi)發(fā)復(fù)雜度。v2928資訊網(wǎng)——每日最新資訊28at.com

擴(kuò)展:@Transactional注解

@Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Inherited@Documentedpublic @interface Transactional {    //指定使用的事務(wù)管理器    @AliasFor("transactionManager")    String value() default "";    @AliasFor("value")    String transactionManager() default "";    // 可選的事務(wù)傳播行為設(shè)置    Propagation propagation() default Propagation.REQUIRED;    // 可選的事務(wù)隔離級(jí)別設(shè)置    Isolation isolation() default Isolation.DEFAULT;    // 事務(wù)超時(shí)時(shí)間設(shè)置    int timeout() default -1;    // 讀寫(xiě)或只讀事務(wù),默認(rèn)讀寫(xiě)    boolean readOnly() default false;    // 導(dǎo)致事務(wù)回滾的異常類(lèi)數(shù)組     Class<? extends Throwable>[] rollbackFor() default {};    // 導(dǎo)致事務(wù)回滾的異常類(lèi)名字?jǐn)?shù)組    String[] rollbackForClassName() default {};    // 不會(huì)導(dǎo)致事務(wù)回滾的異常類(lèi)數(shù)組    Class<? extends Throwable>[] noRollbackFor() default {};    // 不會(huì)導(dǎo)致事務(wù)回滾的異常類(lèi)名字?jǐn)?shù)組    String[] noRollbackForClassName() default {};}

Spring事務(wù)實(shí)踐

非入門(mén)選手下面的demo可能會(huì)引起你的不適(浪費(fèi)時(shí)間)。
假設(shè)我要完成一個(gè)功能,當(dāng)刪除用戶的時(shí)候,將與該用戶有關(guān)的所有數(shù)據(jù)行都刪除。v2928資訊網(wǎng)——每日最新資訊28at.com

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

這樣的寫(xiě)法一般來(lái)講,會(huì)成功的完成任務(wù)。但是如果這樣一段代碼:v2928資訊網(wǎng)——每日最新資訊28at.com

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

結(jié)果會(huì)是:deleteByUserId()執(zhí)行成功,deleteById()執(zhí)行失敗,不滿足數(shù)據(jù)的一致性。v2928資訊網(wǎng)——每日最新資訊28at.com

所以我們需要事務(wù)來(lái)限制:要么全部執(zhí)行,要么全部不執(zhí)行(方法中有異常就自動(dòng)回滾)。那怎么實(shí)現(xiàn)呢,只需要在方法上加一個(gè)注解:@Transactionalv2928資訊網(wǎng)——每日最新資訊28at.com

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

Spring 加載第三方事務(wù)管理

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

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

我們只需要這樣做便可以使的使用@Transactional注解來(lái)實(shí)現(xiàn)對(duì)RabbitMQ的事務(wù)管理,其它框架也類(lèi)似。v2928資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-12417-0.htmlSpring事務(wù)管理—快速入門(mén)

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

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

下一篇: HTTP協(xié)議揭秘:探尋互聯(lián)網(wǎng)的背后密碼、探秘?cái)?shù)據(jù)傳輸?shù)膴W秘

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
  • 7月安卓手機(jī)好評(píng)榜:三星S23Ultra好評(píng)率第一

    性能榜和性價(jià)比榜之后,我們來(lái)看最后的安卓手機(jī)好評(píng)榜,數(shù)據(jù)來(lái)源安兔兔評(píng)測(cè),收集時(shí)間2023年7月1日至7月31日,僅限國(guó)內(nèi)市場(chǎng)。第一名:三星Galaxy S23 Ultra好評(píng)率:95.71%在即將迎來(lái)新
  • 帥氣純真少年!日本最帥初中生選美冠軍出爐

    日本第一帥哥初一生選美大賽冠軍現(xiàn)已正式出爐,冠軍是來(lái)自千葉縣的宗田悠良。日本一直熱衷于各種選美大賽,從&ldquo;最美JK&rdquo;起到&ldquo;最美女星&r
  • 印度登月最關(guān)鍵一步!月船三號(hào)今晚進(jìn)入環(huán)月軌道

    8月5日消息,據(jù)印度官方消息,月船三號(hào)將于北京時(shí)間今晚21時(shí)30分左右開(kāi)始近月制動(dòng)進(jìn)入環(huán)月軌道。這是該探測(cè)器能夠成功的最關(guān)鍵步驟之一,如果成功將開(kāi)始圍
  • K6:面向開(kāi)發(fā)人員的現(xiàn)代負(fù)載測(cè)試工具

    K6 是一個(gè)開(kāi)源負(fù)載測(cè)試工具,可以輕松編寫(xiě)、運(yùn)行和分析性能測(cè)試。它建立在 Go 和 JavaScript 之上,它被設(shè)計(jì)為功能強(qiáng)大、可擴(kuò)展且易于使用。k6 可用于測(cè)試各種應(yīng)用程序,包括 Web
  • 一文看懂為蘋(píng)果Vision Pro開(kāi)發(fā)應(yīng)用程序

    譯者 | 布加迪審校 | 重樓蘋(píng)果的Vision Pro是一款混合現(xiàn)實(shí)(MR)頭戴設(shè)備。Vision Pro結(jié)合了虛擬現(xiàn)實(shí)(VR)和增強(qiáng)現(xiàn)實(shí)(AR)的沉浸感。其高分辨率顯示屏、先進(jìn)的傳感器和強(qiáng)大的處理能力
  • 一篇聊聊Go錯(cuò)誤封裝機(jī)制

    %w 是用于錯(cuò)誤包裝(Error Wrapping)的格式化動(dòng)詞。它是用于 fmt.Errorf 和 fmt.Sprintf 函數(shù)中的一個(gè)特殊格式化動(dòng)詞,用于將一個(gè)錯(cuò)誤(或其他可打印的值)包裝在一個(gè)新的錯(cuò)誤中。使
  • 共享單車(chē)的故事講到哪了?

    來(lái)源丨海克財(cái)經(jīng)與共享充電寶相差不多,共享單車(chē)已很久沒(méi)有被國(guó)內(nèi)熱點(diǎn)新聞關(guān)照到了。除了一再漲價(jià)和用戶直呼用不起了。近日多家媒體再發(fā)報(bào)道稱(chēng),成都、天津、鄭州等地多個(gè)共享單
  • 滴滴違法違規(guī)被罰80.26億 共存在16項(xiàng)違法事實(shí)

    滴滴違法違規(guī)被罰80.26億 存在16項(xiàng)違法事實(shí)開(kāi)始于2121年7月,歷經(jīng)一年時(shí)間,網(wǎng)絡(luò)安全審查辦公室對(duì)“滴滴出行”網(wǎng)絡(luò)安全審查終于有了一個(gè)暫時(shí)的結(jié)束。據(jù)“網(wǎng)信
  • AI藝術(shù)欣賞體驗(yàn)會(huì)在上海梅賽德斯奔馳中心音樂(lè)俱樂(lè)部上演

    光影交錯(cuò)的鏡像世界,虛實(shí)幻化的視覺(jué)奇觀,虛擬偶像與真人共同主持,這些場(chǎng)景都出現(xiàn)在2019世界人工智能大會(huì)的舞臺(tái)上。8月29日至31日,“AI藝術(shù)欣賞體驗(yàn)會(huì)”在上海
Top