問題描述A項目中有一個方法,先將數(shù)據(jù)保存在mysql中,然后將mysql的插入操作返回數(shù)據(jù)的id作為消息體,通過kafka發(fā)送。(此方法已被@Transactional,所以插入數(shù)據(jù)和發(fā)送消息應(yīng)該會)B項目收到消息后,從MySQL中查詢消息的詳情,并進行后續(xù)操作。線上部署時,mysql是遠程的數(shù)據(jù)庫服務(wù)器,而kafka,A項目,B項目部署在同一臺服務(wù)器。出現(xiàn)一個問題就是,A發(fā)送的消息,B項目已經(jīng)接收,并開始根據(jù)消息中的id查詢數(shù)據(jù)庫,但是此時,數(shù)據(jù)庫的插入操作還未完成,導(dǎo)致查詢結(jié)果為空。這種情況下,如何對數(shù)據(jù)庫插入操作和kafka發(fā)送消息進行控制,確保,B收到消息時,數(shù)據(jù)庫插入操作已經(jīng)完成,并且當(dāng)kafka消息發(fā)送失敗時,能夠正確的回退操作。目前,我的做法是進行手動控制,去掉@Transactional注解,當(dāng)消息發(fā)送出現(xiàn)異常時,手動對之前的數(shù)據(jù)庫插入操作新增的數(shù)據(jù)進行刪除。有沒有更優(yōu)雅的解決方案?
添加回答
舉報
0/150
提交
取消