Seat 事務@GlobalTransactional傳播行為

一,分布式事務傳播行為

調用鏈描述

一個普通事務注解的方法,調用一個分布式事務注解方法

分布式事務注解方法:包含一個本地更新,和兩個外部服務更新操作,涉及三個服務

問題

1,普通事務注解方法,在全局事務問題中,是否會生效回滾@答案是會回滾

原因

1,分布式事務注解,抽離到另外一個類中,不會出現AOP失效的問題

2. 事務傳播機制
FulfillOrderBizService.userCancel 使用 @Transactional 創建本地事務
當調用 OutboundSellOrderBizService.userCancel 時,由于是通過代理對象調用,@GlobalTransactional 能夠正常工作
Seata的分布式事務會接管整個事務管理,包括之前由 @Transactional 開啟的本地事務
3. Seata的工作機制
Seata的 @GlobalTransactional 注解具有以下特點:
一旦開啟全局事務,會覆蓋本地事務管理器
能夠管理跨服務的事務操作
在調用鏈中傳播全局事務上下文

代碼

@Transactional(rollbackFor = Exception.class)
@XLock(prefix = "OUT_BOUND_SELL_ORDER_USER_CANCEL", keys = {"#orderNo"}, leaseTime = 5L, waitTime = 5L)
public void userCancel(String orderNo) {
@GlobalTransactional(rollbackFor = Exception.class)
public void userCancel(OutboundSellOrderCancelParam param) {
 @Transactional(rollbackFor = Exception.class)@XLock(prefix = "OUT_BOUND_SELL_ORDER_USER_CANCEL", keys = {"#orderNo"}, leaseTime = 5L, waitTime = 5L)public void userCancel(String orderNo) {// 更新本地1fulfillOrderService.updateById(new FulfillOrderParam().setId(fulfillOrderBO.getId()).setStatus(FulfillOrderStatusEnum.CANCELED.getCode()));// 調用分布式事務注解方法outboundSellOrderBizService.userCancel(cancelParam);}@GlobalTransactional(rollbackFor = Exception.class)public void userCancel(OutboundSellOrderCancelParam param) {// 更新本地2,抽離到另外一個類,不需要加注解OutboundOrder outboundOrder = outboundOperateService.userCancel(param);// 更新遠程服務 取消配送和取貨服務cancelDeliveryAndReceiveOrder("C端用戶取消", param, outboundOrder);}/*** 取消配送和取貨服務*/private void cancelDeliveryAndReceiveOrder(String operator, OutboundSellOrderCancelParam param, OutboundOrder outboundOrder) {// 更新取貨服務boolean cancelResult = receiveOrderService.cancelOrder(new OrderParam().setOutOrderCode(outCode).setOperationUser(param.getOperationUser()).setOperationEnterprise(param.getOperationEnterprise()));// 更新配送服務CancelDeliveryBO cancelDeliveryBO = deliveryService.cancel(new CancelDeliveryParam().setLogisticsNo(outboundOrder.getLogisticsNo()).setCancelTime(new Date()));}// 更新本地2,抽離到另外一個類,不需要加注解@Overridepublic OutboundOrder userCancel(BaseOutboundOpParam param) {

疑問及測試說明

* todo 分布式事務問題
* order 是否需要回滾
* 取消出庫單失敗,回滾
* 取消配送,是否回滾 @回滾
* FulfillOrderBizService.userCancel 方法中的本地事務會覆蓋掉 OutboundSellOrderBizService.userCancel 方法的分布式事務特性
* @實際不會覆蓋。應該配送失敗,取貨是否回滾,判斷分布式事務 @回滾
*/

二,內部調用導致事務失效解決

需求描述

批量取消配送單,可部分成功,部分失敗。

調用鏈:wms 分別調用配送中心,取貨中心

實現目標

可以實現獨立事務

可以實現分布式事務

代碼

public List<OutboundSellOrderCancelVO> cancel(OutboundSellOrderCancelForm form) {List<OutboundSellOrderCancelVO> results = new ArrayList<>();for (String outCode : form.getOutCodes()) {try {// 每個訂單獨立事務處理OutboundSellOrderCancelVO result = self.processSingleOrderInTransaction(outCode, form);results.add(result);} catch (Exception e) {log.error("取消分配 失敗, 出庫單號: {}, 錯誤信息: {}", outCode, e.getMessage(), e);OutboundSellOrderCancelVO failureVO = new OutboundSellOrderCancelVO();failureVO.setOutCode(outCode);failureVO.setErrorMessage(e.getMessage());results.add(failureVO);}}log.info("取消分配 完成,總數: {}, 成功: {}, 失敗: {}",form.getOutCodes().size(),results.stream().filter(vo -> StringUtils.isBlank(vo.getErrorMessage())).count(),results.stream().filter(vo -> StringUtils.isNotBlank(vo.getErrorMessage())).count());return results;}/*** 每個訂單獨立事務處理*/@GlobalTransactional(rollbackFor = Exception.class)public OutboundSellOrderCancelVO processSingleOrderInTransaction(String outCode, OutboundSellOrderCancelForm form) {OutboundSellOrderCancelParam param = new OutboundSellOrderCancelParam();param.setOutCode(outCode);param.setOperationUser(form.getOperationUser());param.setOperationEnterprise(form.getOperationEnterprise());// 1. 取消銷售出庫單OutboundOrder outboundOrder = outboundOperateService.cancelDelivery(param);param.setExternalCode(outboundOrder.getExternalCode());// 2. 取消配送單、取貨單cancelDeliveryAndReceiveOrder("B端取消", param, outboundOrder);// 返回成功結果return new OutboundSellOrderCancelVO().setOutCode(outboundOrder.getOutCode());}

疑問及測試說明

/*** 事務生效問題* processSingleOrderInTransaction self* self @回滾* not self @不回滾** 事務傳播問題* self 前提下,刪除outboundService.cancelDelivery 事務注解* @當 outboundService.cancelDelivery 方法沒有 @Transactional 注解,但被一個已有事務的方法調用時,它會加入當前事務。** 事務獨立問題* self 前提下,一個成功,一個失敗,失敗會回滾** 分布式事務問題* 配送失敗,回滾,出庫單,取貨單* @生效*/

解決方法

通過self實現自調用

OutboundSellOrderCancelVO result = self.processSingleOrderInTransaction(outCode, form);

類實現自注入接口,在類中注入它自己

public class OutboundSellOrderBizService implements BeanSelfAware {
private OutboundSellOrderBizService self;
@Override
public void setSelf(Object proxyBean) {self = (OutboundSellOrderBizService) proxyBean;
}
/*** spring 自身注入自身方法 , 解決內部方法調用不走代理的問題.** @author Luo* @date 2021-9-23 10:59:37*/
public interface BeanSelfAware {/*** 注入自身對象.** @param proxyBean 代理bean*/void setSelf(Object proxyBean);
}

實現原理

總結:要通過代理對象調用,怎么獲取代理對象

工作原理
Spring容器初始化:當Spring容器創建OutboundSellOrderBizService bean時,會創建一個代理對象(如果存在AOP切面)
回調注入:Spring通過BeanSelfAware接口的setSelf方法,將代理對象注入到self字段中

疑問

1,代理對象什么實現創建的

2,具體如何將代理對象注入到self字段中

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/95737.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/95737.shtml
英文地址,請注明出處:http://en.pswp.cn/web/95737.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

美團龍貓利用expat庫實現的保存xml指定范圍數據到csv的C程序

用自己代碼逐個字符解析的速度較慢&#xff0c;嘗試了libxml2也比較慢&#xff0c;它需要一次性讀入內存&#xff0c;而expat庫支持流式讀取。就讓龍貓寫了一個程序&#xff0c;畢竟是久經考驗的庫&#xff0c;程序很快就調試通過了。要不是我一開始沒信心&#xff0c;讓他先輸…

Transformer核心—自注意力機制

Transformer基礎—自注意力機制 當我們處理文本、語音這類序列數據時&#xff0c;總會遇到一個老問題&#xff1a;模型到底該怎么理解“前后文”呢&#xff1f; RNN 和 LSTM 曾經是熱門的答案&#xff0c;它們沿著時間順序一點點地讀數據&#xff0c;但讀得太慢&#xff0c;還容…

分片上傳-

分片上傳原理&#xff1a;客戶端將選擇的文件進行切分&#xff0c;每一個分片都單獨發送請求到服務端&#xff1b;斷點續傳 & 秒傳原理&#xff1a;客戶端 發送請求詢問服務端某文件的上傳狀態 &#xff0c;服務端響應該文件已上傳分片&#xff0c;客戶端再將未上傳分片上傳…

零知開源——基于STM32F103RBT6的智能風扇控制系統設計與實現

?零知IDE 是一個真正屬于國人自己的開源軟件平臺&#xff0c;在開發效率上超越了Arduino平臺并且更加容易上手&#xff0c;大大降低了開發難度。零知開源在軟件方面提供了完整的學習教程和豐富示例代碼&#xff0c;讓不懂程序的工程師也能非常輕而易舉的搭建電路來創作產品&am…

ReACT Agent概述

目錄 1. 核心思想&#xff1a;解決傳統方法的局限性 2. ReACT 的工作原理&#xff1a;一個循環過程 3. 技術實現的關鍵要素 4. ReACTAgent 在任務中的具體工作流程 5. 優勢與重要性 6. 挑戰與局限性 總結 ReACT 是一個非常重要的框架&#xff0c;它代表了構建能夠推理&a…

必知!機器人的分類與應用:RPA、人形與工業機器人

每當提及“機器人”這三個字&#xff0c;許多人的第一反應或許仍是科幻電影中那種具備人類外形、可自由行走與對話的仿生裝置。然而&#xff0c;一個值得深入探討的科技現實是&#xff1a;我們對于人形機器人的迷戀&#xff0c;更多源自文化敘事與情感投射&#xff0c;而非真實…

最快的 C 語言 JSON 庫 - yyjson

文章目錄DOM 模式下的性能比對一、AWS EC2 (AMD EPYC 7R32, gcc 9.3)二、iPhone (Apple A14, clang 12)持續更新中 持續更新中 持續更新中一個用 ANSI C(C89) 編寫的高性能 JSON 庫 API.md DOM 模式下的性能比對 DOM 模式&#xff0c;即構建完整 JSON 內存結構后訪問數據的模…

TP8 模型save更新不成功

一、User文件頭部代碼class User extends Model {const TITLE_NAME 用戶;//名稱//不能刪除protected $name user_; //表名 protected $connection \app\services\database\model\DbConnModel::CONN_DB_SITE; //數據庫的連接二、更新部分我要更新user_1用戶表中的用戶信息$se…

中囯移動電視盒子(魔百和)B860AV2.1-A2和CM311-5-zg刷機手記

文章目錄B860AV2.1-A2電視盒子情況打開隱藏或屏蔽的功能進入Recovery模式打開WiFi&#xff08;如果被隱藏&#xff09;打開運維調試打開ADB調試安裝第三方應用、設置第三方桌面等&#xff08;Fiddler抓包替換官方App安裝包&#xff09;開啟ADB和使用ADB禁止“首次啟動設置”刷機…

【系統架構設計(14)】項目管理下:軟件質量與配置管理:構建可靠軟件的基礎保障

文章目錄一、核心思想二、軟件質量屬性&#xff1a;定義"好軟件"的標準三、質量保證與控制&#xff1a;實現質量標準的方法四、CMMI模型&#xff1a;組織質量能力的演進路徑五、軟件配置管理&#xff1a;質量成果的保護機制六、軟件工具&#xff1a;質量管理的技術支…

碼農的“必修課”:深度解析Rust的所有權系統(與C++內存模型對比)

在軟件開發的世界里&#xff0c;內存管理是至關重要的一個環節。它是程序運行的基礎&#xff0c;直接關系到程序的性能、穩定性和安全性。一個糟糕的內存管理策略&#xff0c;可能導致內存泄漏、野指針、緩沖區溢出等一系列令人頭疼的問題&#xff0c;甚至帶來災難性的安全漏洞…

Java全棧學習筆記30

# MySQL 卸載安裝版電腦管家/360/控制面板卸載mysql服務即可刪除ProgramData中的MySQL目錄解壓版winr 輸入 services.msc 打開服務管理。查看是否存在MySQL&#xff0c;如果存在則刪除注冊表 winR regedit 打開注冊表計算機\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Servic…

Transformers 學習入門:前置知識補漏

在學習 Transformers 之前&#xff0c;打好神經網絡和自然語言處理的基礎至關重要。本文整理了需要掌握的核心前置知識&#xff0c;用通俗的例子幫你快速理解復雜概念&#xff0c;為后續學習鋪平道路。? 一、神經網絡基礎? 1. 多層感知機&#xff08;MLP&#xff09;&#xf…

雙攝工業相機的主要特點和應用場景

雙攝工業相機&#xff08;雙目攝像頭&#xff09;在工業領域中的應用非常廣泛&#xff0c;其核心優勢在于通過雙鏡頭模擬人眼立體視覺&#xff0c;能夠獲取深度信息并實現高精度三維重建。 一、雙攝工業相機的核心優勢 深度感知與三維重建 雙目攝像頭通過兩個鏡頭從不同角度拍…

YOLOv11改進:FocalModulation替換SPPF(精度更高的空間金字塔池化)

YOLOv11&#xff1a;FocalModulation替換SPPF&#xff08;精度更高的空間金字塔池化&#xff09; 引言 在目標檢測領域&#xff0c;YOLO系列算法以其高效性和準確性廣受歡迎。作為YOLO系列的最新成員之一&#xff0c;YOLOv11在多個方面進行了優化和改進。其中&#xff0c;空間金…

LLM與數據工程的融合:衡石Data Agent的語義層與Agent框架設計

在數字經濟浪潮中&#xff0c;企業數據智能正經歷從"工具輔助"到"智能協同"的范式躍遷。傳統BI系統受限于靜態報表與預設指標&#xff0c;難以應對動態業務場景的復雜需求。衡石科技發布的HENGSHI SENSE 6.0通過"Data AI Agent"架構創新&#x…

假設一個算術表達式中包含圓括號、方括號和花括號3種類型的括號,編寫一個算法來判別,表達式中的括號是否配對,以字符“\0“作為算術表達式的結束符

思想:這道題是棧的應用類型&#xff0c;我們可以建立一個棧來保存(,[,{,通過遍歷字符串如果是三個左括號其中一個則入棧&#xff0c;當遇到)]}則出棧配對&#xff0c;如果左右匹配&#xff0c;則遍歷下一個元素&#xff0c;如果不匹配直接返回&#xff0c;如果遍歷字符串結束&a…

鴻蒙Next的UI國際化與無障礙適老化實踐:構建全球包容的數字世界

科技不應讓任何人掉隊&#xff0c;鴻蒙Next正將這一理念變為現實在全球化日益深入的今天&#xff0c;應用的國際化與無障礙設計不再是"錦上添花"&#xff0c;而是不可或缺的核心競爭力。華為鴻蒙Next系統從設計之初就深入考慮了這些需求&#xff0c;為開發者提供了完…

深度學習——遷移學習

遷移學習作為深度學習領域的一項革命性技術&#xff0c;正在重塑我們構建和部署AI模型的方式。本文將帶您深入探索遷移學習的核心原理、詳細實施步驟以及實際應用中的關鍵技巧&#xff0c;幫助您全面掌握這一強大工具。遷移學習的本質與價值遷移學習的核心思想是"站在巨人…

RAG|| LangChain || LlamaIndex || RAGflow

大模型&#xff1a;預訓練模型 外掛知識庫&#xff1a;知識庫->向量數據庫 輸入-》預處理成向量 提示詞-》llm歸納總結 離線&#xff1a;企業原文本存到向量數據庫 向量&#xff1a; 同一個向量模型&#xff08;第二代檢索&#xff0c;推薦&#xff0c;個人助理&#xff0c;…