成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開(kāi)發(fā) 架構(gòu)
說(shuō)起事務(wù),大家應(yīng)該多多少少用過(guò),尤其是在一個(gè)Service方法中調(diào)用多次Dao操作,我們一定要用到事務(wù)(@Transational注解),那么這個(gè)事務(wù)的默認(rèn)隔離級(jí)別和傳播機(jī)制是什么呢?

先來(lái)講講臟讀 不可重復(fù)讀 和 幻讀。

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

事務(wù)四大特性 ACID

1、原子性(Atomicity)

要求事務(wù)所包含的全部操作是一個(gè)不可分割的整體,如果有一步發(fā)生異常,則全部不提交。

2、一致性(Consistency)

A給B轉(zhuǎn)錢(qián),A減和B增這兩個(gè)操作必須保持一致。

3、隔離性(Isolation)

事務(wù)會(huì)將一部分?jǐn)?shù)據(jù)與其他事務(wù)隔離,防止臟讀等。

4、持久性(Durability)

事務(wù)的結(jié)果被寫(xiě)到持久化存儲(chǔ)器中。

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

隔離級(jí)別越高,則性能相對(duì)越低,反之亦然。

1、Read Uncommitted

最低的隔離級(jí)別,跟你直譯的意思一樣:可以讀取其它事務(wù)未完成的結(jié)果。(臟讀)

很明顯,臟讀 不可重復(fù)讀 和 幻讀這三個(gè)問(wèn)題它都有。

2、Read Committed

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

它可以避免臟讀,但是也有不可重復(fù)讀取和幻讀的問(wèn)題。

3、Repeatable Read

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

Repeatable Read隔離級(jí)別避免了臟讀和不可重復(fù)讀取的問(wèn)題,但無(wú)法避免幻讀。

4、Serializable

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

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

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

事務(wù)傳播行為

含義

PROPAGATION_REQUIRED(默認(rèn))

必須在事務(wù)中執(zhí)行,如果沒(méi)有,就新new一個(gè)新事務(wù)

PROPAGATION_SUPPORTS

誰(shuí)調(diào)用我我就在誰(shuí)的事務(wù)中執(zhí)行,沒(méi)有的話就沒(méi)有

PROPAGATION_MANDATORY

必須要有事務(wù),沒(méi)有就報(bào)錯(cuò)

PROPAGATION_REQUIRED_NEW

不管調(diào)用我的方法有沒(méi)有事務(wù),我都new一個(gè)事務(wù)

PROPAGATION_NOT_SUPPORTED

調(diào)用我的方法有事務(wù),但我不在事務(wù)中執(zhí)行

PROPAGATION_NEVER

不允許在事務(wù)中運(yùn)行,有事務(wù)則報(bào)錯(cuò)

PROPAGATION_NESTED

有事務(wù)則嵌套,沒(méi)有則new一個(gè)新事務(wù)

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

我們都知道,JDBC給我們提供了事務(wù)。

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

獲取事務(wù)隔離級(jí)別。

Connection.getTransactionIsolation()

設(shè)置事務(wù)隔離級(jí)別。

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)。

那么,Spring提供的事務(wù)管理器是什么呢?


PlatformTransactionManager.java接口:

PlatformTransactionManager.java

Spring提供的事務(wù)管理器。不同的事務(wù)遵循該事務(wù)管理器的API,便能很輕松的交給Spring管理。

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。

TransactionDefinition.java

它里面包含了事務(wù)的定義。

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)。

public interface TransactionStatus extends SavepointManager, Flushable {
    boolean isNewTransaction();

    boolean hasSavepoint();

    void setRollbackOnly();

    boolean isRollbackOnly();

    void flush();

    boolean isCompleted();
}

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

1、代碼方式使用

@Autowired
private 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、注解方式使用

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

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

擴(kuò)展:@Transactional注解

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @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)刪除用戶(hù)的時(shí)候,將與該用戶(hù)有關(guān)的所有數(shù)據(jù)行都刪除。

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

這樣的寫(xiě)法一般來(lái)講,會(huì)成功的完成任務(wù)。但是如果這樣一段代碼:

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

結(jié)果會(huì)是:deleteByUserId()執(zhí)行成功,deleteById()執(zhí)行失敗,不滿足數(shù)據(jù)的一致性。

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

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

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

比如我有個(gè)需求(接著上次的強(qiáng)票系統(tǒng)II),要求信息不能丟失,要用到RabbitMQ的事務(wù)管理,那怎么去加載到Spring的事務(wù)管理器中呢?

@Bean
public ConnectionFactory connectionFactory() {
    CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
    return connectionFactory;
}

@Bean
public RabbitTransactionManager rabbitTransactionManager(ConnectionFactory connectionFactory) {
    return new RabbitTransactionManager(connectionFactory);
}

我們只需要這樣做便可以使的使用@Transactional注解來(lái)實(shí)現(xiàn)對(duì)RabbitMQ的事務(wù)管理,其它框架也類(lèi)似。

責(zé)任編輯:姜華 來(lái)源: 今日頭條
相關(guān)推薦

2009-06-17 14:57:11

Spring事務(wù)管理

2009-06-30 16:57:42

Spring事務(wù)管理

2009-06-08 17:56:00

SpringJDBC事務(wù)

2023-03-27 10:40:09

2014-08-25 09:12:47

Spring事務(wù)管理

2025-02-21 08:00:00

事務(wù)管理SpringBootJava

2010-03-29 13:34:15

ibmdwSpring

2009-09-25 12:59:53

Hibernate事務(wù)

2010-03-23 08:46:40

Spring

2025-02-18 13:00:00

SpringBoot事務(wù)管理代碼

2009-02-11 13:08:29

事務(wù)提交事務(wù)管理Spring

2009-02-11 11:14:31

事務(wù)管理事務(wù)開(kāi)始Spring

2009-06-17 14:43:47

Spring框架Spring事務(wù)管理

2025-02-08 10:56:18

2009-06-03 10:20:11

Hibernate事務(wù)管理配置

2009-09-29 09:44:52

Hibernate事務(wù)

2009-09-23 17:48:00

Hibernate事務(wù)

2023-05-06 07:29:49

Spring事務(wù)傳播

2022-08-04 08:46:16

單體架構(gòu)微服務(wù)事務(wù)管理

2009-07-17 14:03:34

ibatis DAO事務(wù)管理
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产精品自产av一区二区三区 | 色婷婷综合久久久久中文一区二区 | 色毛片 | 日韩免费一区二区 | 涩涩片影院 | 成人av免费网站 | 爱爱免费视频网站 | 国产三级一区二区 | 18av在线播放 | 欧美精品在线一区 | 日韩视频在线观看 | 一级做a爰片性色毛片视频停止 | 欧美国产免费 | 国产高清亚洲 | a中文在线视频 | 国产做爰 | aaa一区| 国产成人精品在线 | 亚洲精品乱码久久久久久蜜桃 | 国精产品一区一区三区免费完 | 在线观看中文字幕 | julia中文字幕久久一区二区 | 欧美日韩亚洲一区 | 亚洲综合色自拍一区 | 国产精品一区二区三区在线 | 91日b| 国产乱码精品一区二区三区中文 | 亚洲综合二区 | 中文字幕一区二区三区在线观看 | 国产一区免费 | 国产免费一区二区三区 | 99re视频在线观看 | 日本三级网站在线 | 久久av资源网 | 黄色一级电影免费观看 | 91欧美 | 日韩欧美成人精品 | 免费特级黄毛片 | 精品一区二区久久 | 国产精品看片 | 午夜伦理影院 |