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í)能夠回滾所做的更改。
使用步驟:
- 引入依賴(lài):首先確保你的項(xiàng)目中已經(jīng)包含了Spring的相關(guān)依賴(lài)。
- 開(kāi)啟事務(wù)管理:在Spring Boot應(yīng)用中,可以通過(guò)在主類(lèi)或配置類(lèi)上添加@EnableTransactionManagement注解來(lái)啟用事務(wù)管理功能。如果你使用的是Spring Boot,默認(rèn)情況下這個(gè)是自動(dòng)配置好的。
- 標(biāo)記方法:使用@Transactional注解直接標(biāo)注在需要事務(wù)管理的方法上,或者標(biāo)注在整個(gè)類(lèi)上使該類(lèi)的所有公共方法都默認(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依賴(lài):確保你的項(xiàng)目中包含Seata客戶(hù)端的依賴(lài)。
- 配置Seata:根據(jù)Seata的文檔配置Seata服務(wù)端和客戶(hù)端。這包括注冊(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指定其他類(lèi)型的異常也觸發(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類(lèi)型是long,數(shù)據(jù)源是int,在回滾時(shí)GlobalTransactional不會(huì)去識(shí)別類(lèi)型不同的字段 所以回滾失敗。
解決:
只需要同名字段類(lèi)型相同即可回滾成功。
到此這篇關(guān)于Java事務(wù)@Transactional 、@GlobalTransactional使用步驟的文章就介紹到這了,更多相關(guān)Java事務(wù)@Transactional 、@GlobalTransactional內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Maven項(xiàng)目中讀取src/main/resources目錄下的配置文件的方法
本篇文章主要介紹了Maven項(xiàng)目中讀取src/main/resources目錄下的配置文件的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12IntelliJ IDEA(2019)安裝破解及HelloWorld案例(圖文)
這篇文章主要介紹了IntelliJ IDEA(2019)安裝破解及HelloWorld案例(圖文),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10java拋出異常后,后續(xù)代碼是否繼續(xù)執(zhí)行詳解
這篇文章主要給大家介紹了關(guān)于java拋出異常后,后續(xù)代碼是否繼續(xù)執(zhí)行詳?shù)南嚓P(guān)資料,在Java編程中,異常是當(dāng)程序執(zhí)行時(shí)遇到問(wèn)題時(shí)拋出的一種特殊情況,需要的朋友可以參考下2023-07-07java判斷Long類(lèi)型的方法和實(shí)例代碼
在本篇文章里小編給大家整理的是關(guān)于java判斷Long類(lèi)型的方法和實(shí)例代碼,對(duì)此有需要的朋友們跟著學(xué)習(xí)參考下。2020-02-02Java通過(guò)SSH連接路由器輸入命令并讀取響應(yīng)的操作方法
最近需要讀取和修改華為路由器的配置,使用Java語(yǔ)言開(kāi)發(fā),通過(guò)SSH連接,輸入命令并讀取響應(yīng),接下來(lái)通過(guò)本文給大家介紹下Java通過(guò)SSH連接路由器,輸入命令并讀取響應(yīng),需要的朋友可以參考下2024-01-01Java函數(shù)式編程(十二):監(jiān)控文件修改
這篇文章主要介紹了Java函數(shù)式編程(十二):監(jiān)控文件修改,本文是系列文章的第12篇,其它文章請(qǐng)參閱本文底部的相關(guān)文章,需要的朋友可以參考下2014-09-09java多線程解決生產(chǎn)者消費(fèi)者問(wèn)題
這篇文章主要介紹了java多線程解決生產(chǎn)者消費(fèi)者問(wèn)題的方法,實(shí)例分析了java采用多線程的方法解決生產(chǎn)者消費(fèi)者問(wèn)題的相關(guān)技巧,需要的朋友可以參考下2015-05-05java線程中斷?interrupt?和?LockSupport解析
這篇文章主要為大家介紹了java線程中斷?interrupt?和?LockSupport示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02