Java事務(wù)@Transactional?、@GlobalTransactional使用步驟
在微服務(wù)系統(tǒng)中,@Transactional 和 @GlobalTransactional 注解用于管理事務(wù),但它們的應(yīng)用場(chǎng)景和作用范圍有所不同。
@Transactional
@Transactional 是 Spring 框架提供的一個(gè)注解,用來(lái)標(biāo)記需要事務(wù)管理的方法。當(dāng)方法被標(biāo)注為 @Transactional 時(shí),Spring 會(huì)為其創(chuàng)建一個(gè)事務(wù)。如果方法執(zhí)行過(guò)程中發(fā)生異常,則事務(wù)會(huì)被回滾。這個(gè)注解通常用于單個(gè)服務(wù)內(nèi)的數(shù)據(jù)庫(kù)操作,確保這些操作要么全部成功,要么全部不執(zhí)行(回滾)。它適用于以下情況:
- 當(dāng)你需要保證單個(gè)服務(wù)內(nèi)部的一系列數(shù)據(jù)庫(kù)操作的原子性時(shí)。
- 在單個(gè)服務(wù)內(nèi),你希望對(duì)某些方法進(jìn)行事務(wù)管理,以便在出現(xiàn)錯(cuò)誤時(shí)能夠回滾所做的更改。
使用步驟:
- 引入依賴:首先確保你的項(xiàng)目中已經(jīng)包含了Spring的相關(guān)依賴。
- 開(kāi)啟事務(wù)管理:在Spring Boot應(yīng)用中,可以通過(guò)在主類或配置類上添加@EnableTransactionManagement注解來(lái)啟用事務(wù)管理功能。如果你使用的是Spring Boot,默認(rèn)情況下這個(gè)是自動(dòng)配置好的。
- 標(biāo)記方法:使用@Transactional注解直接標(biāo)注在需要事務(wù)管理的方法上,或者標(biāo)注在整個(gè)類上使該類的所有公共方法都默認(rèn)具有事務(wù)性。
public class ServiceClass {
@Transactional
public void performDatabaseOperations() {
// 在這里執(zhí)行數(shù)據(jù)庫(kù)操作
}
}@GlobalTransactional
@GlobalTransactional 一般出現(xiàn)在分布式事務(wù)管理框架中,比如阿里巴巴的 Seata。Seata 提供了 AT、TCC、Saga 和 XA 模式來(lái)解決分布式事務(wù)問(wèn)題。@GlobalTransactional 注解用于標(biāo)識(shí)一個(gè)全局事務(wù),它跨越多個(gè)服務(wù)或資源,確保整個(gè)業(yè)務(wù)流程中的所有操作要么全部提交,要么全部回滾。這在以下場(chǎng)景中特別有用:
- 當(dāng)你的業(yè)務(wù)邏輯涉及到多個(gè)微服務(wù)之間的調(diào)用,并且需要這些服務(wù)的操作具有事務(wù)一致性時(shí)。
- 當(dāng)你需要處理跨數(shù)據(jù)庫(kù)或跨服務(wù)的分布式事務(wù)時(shí),以確保數(shù)據(jù)的一致性和完整性。
使用步驟:
- 引入Seata依賴:確保你的項(xiàng)目中包含Seata客戶端的依賴。
- 配置Seata:根據(jù)Seata的文檔配置Seata服務(wù)端和客戶端。這包括注冊(cè)中心、配置中心等的設(shè)置。
- 開(kāi)啟全局事務(wù)支持:在你的Spring Boot應(yīng)用中,通常無(wú)需額外注解開(kāi)啟全局事務(wù)支持,但需確保Seata配置正確。
- 標(biāo)記方法:使用@GlobalTransactional注解來(lái)標(biāo)記需要進(jìn)行分布式事務(wù)控制的方法
public class DistributedService {
@GlobalTransactional
public void performDistributedTransaction() {
// 執(zhí)行跨服務(wù)的業(yè)務(wù)邏輯
}
}總結(jié)
- 使用 @Transactional 來(lái)管理單個(gè)服務(wù)內(nèi)的本地事務(wù)。
- 使用 @GlobalTransactional 來(lái)管理涉及多個(gè)服務(wù)或資源的分布式事務(wù),確??绶?wù)調(diào)用之間的一致性。
- 異常處理:默認(rèn)情況下只有遇到運(yùn)行時(shí)異常和錯(cuò)誤時(shí)才會(huì)觸發(fā)回滾。可以通過(guò)屬性rollbackFor指定其他類型的異常也觸發(fā)回滾。
- 傳播行為:可以使用propagation屬性定義事務(wù)的傳播行為,比如是否在一個(gè)已存在的事務(wù)中運(yùn)行還是創(chuàng)建新的事務(wù)。
- 隔離級(jí)別:通過(guò)isolation屬性設(shè)定事務(wù)的隔離級(jí)別。
附:@GlobalTransactional回滾失效
問(wèn)題: @GlobalTransactional和mapstruct轉(zhuǎn)換器同時(shí)使用有時(shí)候不會(huì)回滾,但是GlobalTransactional日志輸出的是回滾成功,但是數(shù)據(jù)庫(kù)的數(shù)據(jù)還是生成了或者是改變了。
問(wèn)題所在:

這里是mapstruct轉(zhuǎn)換器所生成的代碼,目標(biāo)id類型是long,數(shù)據(jù)源是int,在回滾時(shí)GlobalTransactional不會(huì)去識(shí)別類型不同的字段 所以回滾失敗。
解決:
只需要同名字段類型相同即可回滾成功。
到此這篇關(guān)于Java事務(wù)@Transactional 、@GlobalTransactional使用步驟的文章就介紹到這了,更多相關(guān)Java事務(wù)@Transactional 、@GlobalTransactional內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot開(kāi)發(fā)實(shí)戰(zhàn)系列之定時(shí)器
定時(shí)任務(wù)我想諸位童鞋都不陌生,簡(jiǎn)而言之名為“設(shè)定定時(shí)鬧鐘做某件事情”,下面這篇文章主要給大家介紹了關(guān)于SpringBoot定時(shí)器的相關(guān)資料,需要的朋友可以參考下2021-08-08
java快速排序和選擇排序?qū)崿F(xiàn)實(shí)例解析
這篇文章主要為大家介紹了java快速排序和選擇排序?qū)崿F(xiàn)實(shí)例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
Springboot轉(zhuǎn)發(fā)重定向?qū)崿F(xiàn)方式解析
這篇文章主要介紹了springboot轉(zhuǎn)發(fā)重定向?qū)崿F(xiàn)方式解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
spring boot搭建文件服務(wù)器解決同時(shí)上傳多個(gè)圖片和下載的問(wèn)題
這篇文章主要介紹了spring boot搭建文件服務(wù)器解決同時(shí)上傳多個(gè)圖片和下載的問(wèn)題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11
Java 數(shù)據(jù)庫(kù)連接(JDBC)的相關(guān)總結(jié)
這篇文章主要介紹了Java 數(shù)據(jù)庫(kù)連接(JDBC)的相關(guān)總結(jié),幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下2021-03-03
Java實(shí)現(xiàn)excel動(dòng)態(tài)列導(dǎo)出的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)excel動(dòng)態(tài)列導(dǎo)出,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03
SpringBoot獲取Request對(duì)象的幾種方法
HttpServletRequest 簡(jiǎn)稱 Request,它是一個(gè) Servlet API 提供的對(duì)象,用于獲取客戶端發(fā)起的 HTTP 請(qǐng)求信息,那么問(wèn)題來(lái)了,在 Spring Boot 中,獲取 Request 對(duì)象的方法有哪些?所以本文給大家介紹了SpringBoot獲取Request對(duì)象的幾種方法,需要的朋友可以參考下2024-11-11
Java+mysql本地圖片上傳數(shù)據(jù)庫(kù)及下載示例
本篇文章主要介紹了Java+mysql本地圖片上傳數(shù)據(jù)庫(kù)及下載示例,具有一定的參加價(jià)值,有興趣的可以了解一下。2017-01-01

