最近接觸的一些系統中遇到乙個問題,乙個交易的服務對外提供了支付和退款兩種能力,但是發現執行時交易的服務走了退款。
原因是spring容器管理的乙個物件service 屬性執行時被改變,導致上下流程對不上的問題,多業務鏈路併發時引發執行時屬性錯亂,導致 支付和退款行為混淆
下面是大體**樣例。記錄下問題原因
1、定義乙個核心支付服務
public
inte***ce
coreservice
2、抽象兩個業務單元 驗證和執行public
inte***ce
tradeservice
extends
coreservice
3、實現共享邏輯**@service
public
class
tradeserviceimpl
implements
tradeservice
@override
public
void
setverificationservice
(verificationservice verificationservice)
@override
public operationservice getoperationservice()
@override
public
void
setoperationservice
(operationservice operationservice)
@override
public baseresult trade
(tradeparam tradeparam)
}
4、實現支付鏈路public
class
payserviceimpl
implements
coreservice
}
5、實現退款鏈路public
class
refundserviceimpl
implements
coreservice
}
經上方案實現落地後, 支付和退款業務併發時就有概率導致支付和退款執行時對應的實際邏輯單元混亂,導致要支付的實際退款,要退款的實際支付的事情發生。 因為tradeservice服務是容器管理的單例,多鏈路併發修改了單例內的屬性,導致執行時故障
修改的方式有很多,最終只要保證執行時的節點資料不存在被覆蓋的目的即可。
最簡單的替換方案就是將兩個set值的邏輯類去掉,改為bean初始化時注入,支付和退款各自初始化乙個不同的tradeservice即可
matlab 單雙精度引發的血案
今天在測試乙個演算法時遇到了少見的問題,覺得值得記錄,總結起來,可以用下面幾行 來表示 看到了麼,這個數字在加減去1後都是不變的,然而,當bbb不是單精度時,答案就是正確的 當然,在互動行中直接賦值的變數預設是double型別。這麼寫只是為了強調資料的格式。matlab在用雙精度減 或加 單精度型別...
signed unsigned 引發的血案
bug描述 問題產生於區域網傳輸一幅。服務端負責傳送,是由另乙個同事用c 寫的,我用c 寫接收客戶端。我們約定在傳輸一幅前,先傳固定4個位元組的size資訊,然後傳資料。結果發現有些總是末尾壞掉一截或是乾脆就傳不過來。bug原因 在我接收到size 4 後,我採用了size size 3 256 2...
merge all引發的血案
在訓練深度神經網路的時候,我們經常會使用dropout,然而在test的時候,需要把dropout撤掉.為了應對這種問題,我們通常要建立兩個模型,讓他們共享變數。詳情.為了使用tensorboard來視覺化我們的資料,我們會經常使用summary,最終都會用乙個簡單的merge all函式來管理我們...