欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring如何實(shí)現(xiàn)管理事務(wù)

 更新時(shí)間:2024年11月16日 08:49:25   作者:賺夠壹仟萬(wàn)  
Spring通過(guò)編程式事務(wù)和聲明式事務(wù)管理來(lái)控制事務(wù)的邊界和行為,聲明式事務(wù)管理通過(guò)@Transactional注解實(shí)現(xiàn),提供了豐富的配置選項(xiàng)來(lái)控制事務(wù)的行為,如傳播行為、隔離級(jí)別、超時(shí)時(shí)間和回滾規(guī)則

spring通過(guò)編程式事務(wù)和聲明式事務(wù)管理來(lái)控制事務(wù)的邊界和行為。

1. 事務(wù)管理器

Spring 通過(guò)事務(wù)管理器(Transaction Manager)來(lái)管理事務(wù)。不同的持久化技術(shù)(如 JDBC、JPA、Hibernate)對(duì)應(yīng)不同的事務(wù)管理器,例如:

  • DataSourceTransactionManager:用于管理 JDBC 事務(wù)。
  • JpaTransactionManager:用于管理 JPA 事務(wù)。
  • HibernateTransactionManager:用于管理 Hibernate 事務(wù)。

事務(wù)管理器是 Spring 事務(wù)管理的核心,它負(fù)責(zé)處理事務(wù)的開(kāi)始、提交和回滾。

2. 編程式事務(wù)管理

編程式事務(wù)管理是指在代碼中顯式地管理事務(wù),通常使用 TransactionTemplate 或者底層的 PlatformTransactionManager。

使用 TransactionTemplate

@Autowired
private TransactionTemplate transactionTemplate;

public void someMethod() {
    transactionTemplate.execute(status -> {
        // 執(zhí)行業(yè)務(wù)邏輯
        // status.setRollbackOnly(); // 回滾事務(wù)
        return null;
    });
}

使用 PlatformTransactionManager

@Autowired
private PlatformTransactionManager transactionManager;

public void someMethod() {
    DefaultTransactionDefinition def = new DefaultTransactionDefinition();
    TransactionStatus status = transactionManager.getTransaction(def);

    try {
        // 執(zhí)行業(yè)務(wù)邏輯
        transactionManager.commit(status); // 提交事務(wù)
    } catch (Exception e) {
        transactionManager.rollback(status); // 回滾事務(wù)
    }
}

3. 聲明式事務(wù)管理

聲明式事務(wù)管理是通過(guò) AOP(面向切面編程)和注解來(lái)管理事務(wù),通常使用 @Transactional 注解。

這種方式更加簡(jiǎn)潔和方便,推薦使用。

使用 @Transactional 注解

import org.springframework.transaction.annotation.Transactional;

@Service
public class MyService {

    @Transactional
    public void someMethod() {
        // 執(zhí)行業(yè)務(wù)邏輯
    }
}

@Transactional 注解可以應(yīng)用于類(lèi)或方法上,它的主要屬性包括:

  • propagation:事務(wù)的傳播行為,定義事務(wù)如何傳播。常用的傳播行為包括:

    • REQUIRED(默認(rèn)):如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒(méi)有事務(wù),則創(chuàng)建一個(gè)新事務(wù)。
    • REQUIRES_NEW:總是創(chuàng)建一個(gè)新事務(wù),如果當(dāng)前存在事務(wù),則掛起當(dāng)前事務(wù)。
    • SUPPORTS:如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒(méi)有事務(wù),則以非事務(wù)方式執(zhí)行。
    • NOT_SUPPORTED:總是以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù),則掛起當(dāng)前事務(wù)。
    • MANDATORY:必須在事務(wù)中執(zhí)行,如果當(dāng)前沒(méi)有事務(wù),則拋出異常。
    • NEVER:必須在非事務(wù)中執(zhí)行,如果當(dāng)前存在事務(wù),則拋出異常。
    • NESTED:如果當(dāng)前存在事務(wù),則創(chuàng)建一個(gè)嵌套事務(wù);如果當(dāng)前沒(méi)有事務(wù),則創(chuàng)建一個(gè)新事務(wù)。
  • isolation:事務(wù)的隔離級(jí)別,定義一個(gè)事務(wù)可以受到其他事務(wù)影響的程度。常用的隔離級(jí)別包括:

    • DEFAULT(默認(rèn)):使用底層數(shù)據(jù)庫(kù)的默認(rèn)隔離級(jí)別。
    • READ_UNCOMMITTED:最低的隔離級(jí)別,允許臟讀。
    • READ_COMMITTED:允許不可重復(fù)讀,防止臟讀。
    • REPEATABLE_READ:允許幻讀,防止臟讀和不可重復(fù)讀。
    • SERIALIZABLE:最高的隔離級(jí)別,防止臟讀、不可重復(fù)讀和幻讀。
  • timeout:事務(wù)超時(shí)時(shí)間,以秒為單位。默認(rèn)值是 -1,表示沒(méi)有超時(shí)限制。

  • readOnly:是否為只讀事務(wù)。默認(rèn)值是 false。只讀事務(wù)通常用于查詢(xún)操作,可以對(duì)某些數(shù)據(jù)庫(kù)優(yōu)化。

  • rollbackFor:指定哪些異常會(huì)導(dǎo)致事務(wù)回滾。例如:rollbackFor = RuntimeException.class。

  • noRollbackFor:指定哪些異常不會(huì)導(dǎo)致事務(wù)回滾。例如:noRollbackFor = IllegalArgumentException.class。

4. 事務(wù)傳播和隔離級(jí)別

事務(wù)傳播和隔離級(jí)別是 Spring 事務(wù)管理的重要概念。

  • 事務(wù)傳播(Propagation):定義了事務(wù)方法被調(diào)用時(shí)事務(wù)的傳播行為。例如,當(dāng)前方法是否要在一個(gè)事務(wù)中運(yùn)行,是否要加入現(xiàn)有的事務(wù),或者是否要開(kāi)啟一個(gè)新的事務(wù)。
  • 隔離級(jí)別(Isolation):定義了一個(gè)事務(wù)可以看到其他事務(wù)對(duì)數(shù)據(jù)的影響程度。常見(jiàn)的隔離級(jí)別包括:READ_UNCOMMITTEDREAD_COMMITTED、REPEATABLE_READSERIALIZABLE。

示例:配置和使用事務(wù)

配置 Spring 事務(wù)管理

在 Spring Boot 中,只需要在主類(lèi)或者配置類(lèi)中添加 @EnableTransactionManagement 注解:

import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
public class AppConfig {
    // 配置數(shù)據(jù)源和事務(wù)管理器等
}

使用 @Transactional 注解

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    @Transactional
    public void createUser(User user) {
        // 創(chuàng)建用戶(hù)的業(yè)務(wù)邏輯
    }
}

總結(jié)

Spring 的事務(wù)管理機(jī)制通過(guò)編程式事務(wù)管理和聲明式事務(wù)管理兩種方式提供了靈活的事務(wù)控制。

聲明式事務(wù)管理是最常用的方式,通過(guò) @Transactional 注解,可以方便地控制事務(wù)的傳播行為、隔離級(jí)別、超時(shí)時(shí)間和回滾規(guī)則。

Spring 事務(wù)管理機(jī)制的強(qiáng)大和靈活性,使得開(kāi)發(fā)者可以輕松地處理復(fù)雜的事務(wù)場(chǎng)景,確保數(shù)據(jù)的一致性和完整性。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • idea2019版與maven3.6.2版本不兼容的解決方法

    idea2019版與maven3.6.2版本不兼容的解決方法

    這篇文章主要介紹了idea2019版與maven3.6.2版本不兼容的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • java讀取excel表格的方法

    java讀取excel表格的方法

    這篇文章主要為大家詳細(xì)介紹了java讀取excel表格的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • springboot3.2整合mybatis-plus詳細(xì)代碼示例

    springboot3.2整合mybatis-plus詳細(xì)代碼示例

    這篇文章主要給大家介紹了關(guān)于springboot3.2整合mybatis-plus的相關(guān)資料,Spring Boot是一個(gè)非常流行的Java Web框架,可以快速地搭建Web應(yīng)用程序,需要的朋友可以參考下
    2023-12-12
  • 如何在Java中實(shí)現(xiàn)一個(gè)散列表

    如何在Java中實(shí)現(xiàn)一個(gè)散列表

    這篇文章主要介紹了如何在Java中實(shí)現(xiàn)一個(gè)散列表,建一個(gè)HashMap,以String類(lèi)型為Key,Int類(lèi)型為Value,下文具體的操作過(guò)程需要的小伙伴可以參考一下
    2022-04-04
  • Springboot中yml對(duì)于list列表配置方式詳解

    Springboot中yml對(duì)于list列表配置方式詳解

    這篇文章主要介紹了Springboot中yml對(duì)于list列表配置方式詳解,使用@ConfigurationProperties讀取yml配置文件過(guò)程中會(huì)遇到讀取yml文件中列表,Config里面使用List集合接收,方法比較簡(jiǎn)單,需要的朋友可以參考下
    2023-11-11
  • spring BeanProcessor接口詳解

    spring BeanProcessor接口詳解

    這篇文章主要介紹了spring BeanProcessor接口的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用spring,感興趣的朋友可以了解下
    2021-03-03
  • 如何使用Spring?Boot設(shè)置上傳文件大小限制

    如何使用Spring?Boot設(shè)置上傳文件大小限制

    上傳文件是互聯(lián)網(wǎng)中常應(yīng)用的場(chǎng)景之一,最典型的情況就是上傳頭像等,下面這篇文章主要給大家介紹了關(guān)于如何使用Spring?Boot設(shè)置上傳文件大小限制的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • Java制作智能拼圖游戲原理及代碼

    Java制作智能拼圖游戲原理及代碼

    本文給大家分享的是使用Java實(shí)現(xiàn)智能拼圖游戲的原理,以及實(shí)現(xiàn)的源碼,推薦給大家,有需要的小伙伴可以參考下。
    2015-03-03
  • 使用JAVA判斷凸多邊形的示例代碼

    使用JAVA判斷凸多邊形的示例代碼

    本文提供了使用JAVA判斷凸多邊形的示例代碼供大家參考學(xué)習(xí),需要的朋友可以看一下
    2013-11-11
  • JavaMail入門(mén)教程之解析郵件(5)

    JavaMail入門(mén)教程之解析郵件(5)

    這篇文章主要為大家詳細(xì)介紹了JavaMail入門(mén)教程之解析郵件的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12

最新評(píng)論