測試
數據庫的初始情況:
-
seata_order.t_order:
-
seata_storage.t_storage: 1號商品總數100,0個售出,實存100.
-
seata_account.t_account: 1號用總金額1000,使用0,餘額1000.
正常下單
啓動nacos、sentinel、seata以及2001、2002、2003微服務 :
訪問:localhost:2001/order/create?userId=1&productId=1&count=10&money=100
訂單表:
庫存表:
賬戶:
正常下單成功。
超時異常,沒加@GlobalTransaction
AccountServiceImpl添加超時:
再次訪問:localhost:2001/order/create?userId=1&productId=1&count=10&money=100
報錯,因爲OpenFeign默認調用時限爲1秒。
查看數據庫:
訂單表:插入了數據,但是因爲accountService報錯,所以status未修改
庫存表:出現嚴重錯誤,下單失敗商品不翼而飛…
賬戶表:出現嚴重錯誤,下單失敗,但是扣錢了,錢貨兩空…
總結:當庫存和賬戶金額扣減後,訂單狀態沒有設置爲已經完成,沒有從0改爲1,而且由於feign的重試機制,賬戶餘額還有可能被多次扣減。
超時異常,添加@GlobalTransactional
在OrderServiceImpl上添加@GlobalTransactional
再次訪問:localhost:2001/order/create?userId=1&productId=1&count=10&money=100
查看數據庫:
訂單表:未插入數據
庫存表:未修改
賬戶表:未修改
結論:下單後數據庫並沒有任何改變,分佈式事務控制成功。