Spring如何實(shí)現(xiàn)管理事務(wù)
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_UNCOMMITTED
、READ_COMMITTED
、REPEATABLE_READ
、SERIALIZABLE
。
示例:配置和使用事務(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版本不兼容的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10springboot3.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è)散列表,建一個(gè)HashMap,以String類(lèi)型為Key,Int類(lèi)型為Value,下文具體的操作過(guò)程需要的小伙伴可以參考一下2022-04-04Springboot中yml對(duì)于list列表配置方式詳解
這篇文章主要介紹了Springboot中yml對(duì)于list列表配置方式詳解,使用@ConfigurationProperties讀取yml配置文件過(guò)程中會(huì)遇到讀取yml文件中列表,Config里面使用List集合接收,方法比較簡(jiǎn)單,需要的朋友可以參考下2023-11-11如何使用Spring?Boot設(shè)置上傳文件大小限制
上傳文件是互聯(lián)網(wǎng)中常應(yīng)用的場(chǎng)景之一,最典型的情況就是上傳頭像等,下面這篇文章主要給大家介紹了關(guān)于如何使用Spring?Boot設(shè)置上傳文件大小限制的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01