上周改了一個(gè)小bug,在開發(fā)環(huán)境自驗(yàn)之后倡缠,就發(fā)布了st哨免,自信走測試回歸。然后測試回歸的時(shí)候卻出問題了昙沦,拋出了個(gè)NPE琢唾,在群里瘋狂艾特我,我麻溜上服務(wù)器看了日志盾饮,沒想到居然是seata的問題采桃。一陣搜索,總算找到問題的原因丘损,居然不是自身代碼問題普办,而是seata一個(gè)issue。
issue鏈接:https://github.com/seata/seata/issues/3330
問題出現(xiàn)的場景:AT模式下徘钥,在進(jìn)行insert前衔蹲,修改表結(jié)構(gòu),添加一列字段吏饿,就會導(dǎo)致NullPointerException踪危,大概等到十分鐘后會正常蔬浙,不再報(bào)錯(cuò),
將seata.client.rm.able-meta-check-enable改為true之后贞远,還是會有1分鐘的延遲畴博,或者重啟clinet,但是正式環(huán)境下重啟服務(wù)不太現(xiàn)實(shí)蓝仲。
復(fù)現(xiàn)步驟:
在使用了seata注釋邏輯操作的表內(nèi)
1.先插入一條數(shù)據(jù)
2.數(shù)據(jù)庫中添加一個(gè)字段
3.再次插入一條數(shù)據(jù)
問題原因
因?yàn)榉植际绞聞?wù)的實(shí)現(xiàn)機(jī)制俱病,seata緩存了表結(jié)構(gòu),而在你變更了表結(jié)構(gòu)后袱结,seata不能及時(shí)更新他的表結(jié)構(gòu)亮隙,導(dǎo)致NPE。
最后解決
可以參考這個(gè)pr
https://github.com/seata/seata/pull/3318/commits/142225229a76b1f06c9a6313a26c984032db2e05
最后seata團(tuán)隊(duì)在代碼中加了一個(gè)配置可以自己配置垢夹,seata檢查表結(jié)構(gòu)的時(shí)間溢吻,同時(shí)也加上了一個(gè)開關(guān),就是是否需要配置這個(gè)時(shí)間果元,之前的默認(rèn)時(shí)間是60s促王。有意思的,大家關(guān)于這個(gè)配置的默認(rèn)值還有一些討論而晒,大部分還是認(rèn)為線上對表機(jī)構(gòu)的修改較少蝇狼,認(rèn)為默認(rèn)false是足夠的。所以如果大家如果toc的系統(tǒng) 有用到seata倡怎,上線還有表結(jié)構(gòu)修改的情況可要注意哦迅耘。