上一篇 https://my.oschina.net/u/3901188/blog/4316832 已經完成了 Seata 的服務端 整合 nacos 的搭建啓動。本篇章記錄 Seata 客戶端實現模擬分佈式事務場景。git
分佈式事務場景準備:客戶端分三個服務 order訂單服務、storage庫存服務、account帳戶餘額服務。三個服務對應的獨立的數據庫。sql
庫須要自行創建,我這裏建立的名稱爲 seata_order、seata_account、seata_storage 三個庫名稱。sql的建庫建表語句我都寫代在項目的sql文件夾中。數據庫
寫在這裏太過於長了,太佔地方了,項目demo我直接打包上傳上碼雲了。項目地址連接: https://gitee.com/maogouxiong/seata-nacos-test-demo 須要的夥伴能夠上去下載下來自行測試。瀏覽器
這裏我主要關鍵點:mybatis
項目我使用了 mybatis-plus 的代碼生成器直接生成代碼。代碼生成器類我放在了每一個服務項目的test目錄下。分佈式
另外代理數據源是要配置的。在代碼裏面每一個服務都有配置代理數據源,須要留意看下工具
我這裏測試 Seata 服務端是經過源碼啓動的。源碼啓動看下我上一篇文章有講到。post
先啓動 Seata 服務端,當 Seata 服務端啓動成功,啓動日誌是這樣的:測試
而後啓動 三個客戶端服務, 當 order訂單服務、storage庫存服務、account帳戶餘額服務 三個服務啓動成功,啓動日誌是下三圖所示:spa
三個服務啓動成功後,Seata 服務端是收到對應的通知:
而後分佈式事務流程是這樣的:
一、瀏覽器或者postman測試工具訪問 order服務建立訂單。 二、order服務建立訂單過程當中,使用 Feign 遠程調用庫存服務進行減庫存,調用用戶餘額服務進行減餘額。 三、接着order服務更新訂單狀態。 最後模擬出現異常 int a = 1/0 ,seata 實現分佈式事務回滾。
整個過程當中,只須要在遠程調用方的方法上加上 @GlobalTransactional(rollbackFor = Exception.class) 註解便可。
原始的數據:
正常commit事務:
數據庫數據變化:
三個服務日誌輸出:
Seata 服務端:
失敗回滾事務:
數據庫數據沒變化:
三個服務日誌輸出:
Seata 服務端: