今天同事給我看一段代碼,是我前年寫的。
他發(fā)現(xiàn)了一個bug。
代碼的作用是用jdbc向mysql中插入一條主鍵自增的數(shù)據(jù),然后使用mysql的select last_insert_id()語法獲取生成的主鍵值。
問題出在兩次sql執(zhí)行用的不是同一個數(shù)據(jù)庫連接,而從數(shù)據(jù)源里獲取了兩次
我們都知道,mysql的last_insert_id()函數(shù)是針對connection的,所以這是個嚴重bug。
之前兩年負載小,所以數(shù)據(jù)源大概每次都返回同一個connection,于是bug被遮蓋住了。最近服務器壓力增加,兩次連接就可能不是同一個了。
因此last_insert_id()得到的主鍵值出錯!

那時候我怎么會獲取兩次連接來執(zhí)行一個方法里的兩句sql,包括我在內所有人都莫名其妙。錯誤比較明顯,這項目已經(jīng)交接給他們了,不過出于對我的信任,還是屁顛屁顛來問我:獲取兩個連接是不是還有其他特殊考慮?我苦思冥想了一會,答曰:忘了。

沒想到我曾經(jīng)養(yǎng)過的臭蟲還到處潛伏著,等著我出丑呢。