redis事務的坑

2021-09-11 02:57:51 字數 891 閱讀 9047

最先參考文章:

後來發現:

redis事務不能使用@transactional標記,刪除方法無法工作,刪不掉。set操作,儲存能生效。嚴重影響了資料一致性。

解決方案:

redistemplatetrans.multi();

long removenumber = removeset(redisgroupkey, rediskey);

boolean delete = delete(rediskey);

redistemplatetrans.exec();

後來發現有時會報錯:err discard without multi

listtxresults = redistemplatetrans.execute(new sessioncallback>() 

}});

解決方案,重寫sessioncallback。

呼叫operations.discard();回滾。可費盡心力後才發現redis事物不支援回滾····就···呵呵

為什麼redis不支援回滾

如果你具備關係型資料庫的知識背景,你就會發現乙個事實:在事務執行期間,雖然redis命令可能會執行失敗,但是redis仍然會執行事務中餘下的其他命令,而不會執行回滾操作,你可能會覺得這種行為很奇怪。

然而,這種行為也有其合理之處:

只有當被呼叫的redis命令有語法錯誤時,這條命令才會執行失敗(在將這個命令放入事務佇列期間,redis能夠發現此類問題),或者對某個鍵執行不符合其資料型別的操作:實際上,這就意味著只有程式錯誤才會導致redis命令執行失敗,這種錯誤很有可能在程式開發期間發現,一般很少在生產環境發現。 

redis已經在系統內部進行功能簡化,這樣可以確保更快的執行速度,因為redis不需要事務回滾的能力。

redis事務詳解 避免踏坑

redis是支援一定事務能力的nosql,在redis中使用事務,通常的命令組合是watch multi exe,也就是要在乙個redis連線中執行多個命令,這是我們可以考慮使用sessioncallback介面來達到這個目的。如上redis事務執行流程,首先watch監控redis的一些鍵 mul...

Redis(四)redis的事務

可以一次執行多個命令,本質是一組命令的集合。乙個事務中的 所有命令都會序列化,按順序地序列化執行而不會被其它命令插入,不許加塞。乙個佇列中,一次性 順序性 排它性的執行一系列命令。開啟 以multi開始乙個事務 入隊 將多個命令入隊到事務中,接到這些命令並不會立即執行,而是放到等待執行的事務佇列裡面...

Redis事務 事務鎖

一旦成功所有的成功,乙個失敗,所有一些列連續動作都失敗 事務的基本操作 注意 加入事務的命令暫時到任務佇列中,並沒有立即執行,只有執行exec命令才開始執行事務定義過程中發現問題,怎麼辦?discard 事務的工作流程 事務的注意事項 手動進行事務回滾 業務場景1 業務分析 基於特定條件的事務執行 ...