1. 程式人生 > >記一次bug的查詢

記一次bug的查詢

前幾天上線了一個關於向攜程同步審批單的東西,但是上去之後,竟然可以重複傳送;這個問題按說是不應該的,呼叫攜程的介面我是單獨啟用的執行緒做的,線上程內部我啟用了鎖,也就是說在同步完成後我會更新狀態,下一個執行緒過來執行是不可能再重複推送的。而且這次攜程那邊可能也沒有做同步控制,也直接出現了兩條資料。

首先我懷疑是不是分散式導致的,因為我只是加了全域性鎖,而伺服器是分散式部署的,有可能是請求分發到不同的伺服器,導致鎖並不能起作用。但是看了下日誌,發現請求也都在一臺機子上,所以就更奇怪了。

最後發現是我的鎖內部又啟用了一個新的執行緒,鎖在裡面的那個執行緒是不起作用的,所以其實跟沒加鎖差不多。

最後,合併執行緒為一個執行緒,加鎖;並且加的是分散式鎖。

稍微延伸下,一般的分散式鎖都是基於資料庫或zookeeper實現的;很多是基於redis實現的,我的這個分散式鎖就是這樣的。