在項目中經常會同時操作mysql與redis 那么如何保證數據的一致性呢
一般增刪改都是先操作MySQL數據庫,成功之后再操作Redis,但這里有個問題,如果MySQL操作成功了,但Redis突然出現異常,操作失敗,如何回滾MySQL操作。
使用注解@Transactional只會回滾MySQL異常的情況,Redis本身也不具備回滾功能,在MySQL操作成功的情況下,@Transactional注解會認為方法並沒有異常,會繼續執行而不回滾,這樣就導致了MySQL和Redis不一致的情況。
為了避免這種情況,每次操作Redis之后,都會判斷Redis有沒有操作成功,操作失敗則進行手動回滾,加一行代碼:
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
配合@Transactional注解即可解決問題。