處理系統中乙個併發引起的bug

2021-07-10 08:16:33 字數 731 閱讀 2349

之前系統在更新某條業務資料的狀態時,並沒有判斷該資料的原來的狀態,直接更新成了最新狀態。這樣如果有多執行緒來訪問**,會出現由於併發導致出現髒資料。

idname

status1測試

1當某個業務請求過來後,我們會把訂單資料的status更新成2,表示訂單完成,然後進行後續業務動作,產生一些正常的業務資料。

order

order

= db.getorder(orderid);

if (order

.getstatus =

1)

這段**是有問題的,如果兩個執行緒同時都通過order.getstatus=1這個判斷,那麼都會去更新資料狀態,並且更新成功進入後續的流程,這樣的話,就會產生一些不必要的資料,對系統和使用者都帶來了影響。

int

count = db.updateorderstatuswithoriginorderstatus(1,2);

可以利用資料庫,把原來的訂單狀態傳遞進去,當執行緒thread1更新資料時,只有訂單狀態還是1的,才進行狀態更新,一旦訂單資料的狀態已經不是1了,說明這條訂單資料被其他的執行緒(這裡假設是thread2)捷足先登的更新了。這個時候,thread1應該return出去了,不要再做任何事情了。

當然也可以使用樂觀鎖來處理,使用version判斷。原理其實跟我上面提到的方案差不多。

由框架中乙個BUG引起的

今天加班在給new guys做培訓的時候,發生了乙個莫名其妙的問題,幾經周折,才發現是公司現有框架的乙個bug。xml converter valueobject objectid lib class com.icsc.tm.mscdao.tmjcs03vo type unique converte...

memcpy引起的乙個bug

void memcpy void dest,const void src,size t n 由src指向位址為起始位址的連續n個位元組的資料複製到以dest指向位址為起始位址的空間內。memcpy dest,0,5 真正應該使用的是 memset dest,0,5 關於memset memset 函...

MFC中乙個危險的Bug

上次說日本海嘯警報的時候,程式出錯。在解析 的時候,發現了mfc中的乙個bug。一。問題的產生。這個程式,用來處理日本各種天氣預報資料,包括災害的預報。如果 颱風之類的自然災害到來,程式會把預報資料進行處理,生成相應的警報資訊,並在電視上面顯示滾動的字幕來提示。程式本身,是幾年前公司的其他人寫的。裡...