Redis學習筆記--事務
事務
mysql事務:
mysql的事務是指在一組sql語句串行執行的時候,要么都成功,要么都失敗,而且執行過程中不會被其它sql語句干擾。mysql事務使用的是begin、commit/rollback
redis事務:
redis的事務和mysql類似,是一組redis語句串行執行,所有命令都會序列化,而且執行過程中不會被其它redis命令干擾。redis事務使用的是multi、exec
redis的事務在執行的時候通過multi開啟,multi之后執行的所有命令都會被放到一個隊列中(queue)通過exec命令來按照順序依次觸發隊列中redis命令的執行,這個過程中不允許有其它redis命令干擾。
事務的步驟:
1、開啟:以multi開始一個事務,如果需要監控可以在multi前增加watch
2、入隊:將多個命令放入到隊列中,這些命令并不會立即執行而是放到等待執行的事務隊列中
3、執行:通過exec命令觸發事務執行
Redis事務和mysql事務的區別:
1、沒有單獨的隔離操作:Redis的事務僅僅是保證事務里的操作會被連續獨占的執行,redis命令執行是單線程架構,在執行完事務內所有指令前是不可能再去同時執行其他客戶端的請求的
2、沒有隔離級別:因為事務提交前任何指令都不會被實際執行,也就不存在”事務內的查詢要看到事務里的更新,在事務外查詢不能看到”這種問題了
3、不保證原子性:Redis的事務不保證原子性,也就是不保證所有指令同時成功或同時失敗,只有決定是否開始執行全部指令的能力,沒有執行到一半進行回滾的能力
4、排它性:Redis會保證一個事務內的命令依次執行,而不會被其它命令插入
事務命令:

執行場景:
1、正常執行:通過multi開啟redis的事務,multi和exec之間的redis命令會被放到隊列中依次執行且不被其它命令干擾,直到全部執行完成為止。示例參考下圖:

2、放棄事務:通過multi開啟redis事務,multi和exec之間的redis命令如果包含discard則放棄事務內所有redis命令的執行。示例參考下圖:

3、語法錯誤:通過multi開啟redis事務,在exec之前如果有命令輸入錯誤(例如語法錯誤)在執行exec的時候就會提示事務已經被取消了,所有的命令都沒能執行成功。這個失敗的觸發點是在exec執行前。示例參考下圖:

4、運行時錯誤:通過multi開啟redis事務,在exec之后發現有部分命令并沒有語法錯誤,但是是無法執行的(例如不存在對應的key做自增操作)則其它正確的命令正常執行,失敗的命令報異常,且數據無法回滾。這點和傳統數據事務有很大區別,示例參考下圖:

5、Watch監控:redis采用樂觀鎖,在通過multi開始事務前使用watch監控某個key,之后輸入redis命令,系統會把命令添加到隊列中,在執行exec觸發事務時,被監控的key發生了變更則當前事務中的所有redis命令都失敗并返回nil,需要重新執行,如果監控key沒有發生變更則事務成功。無論成功與否在exec執行完之后都會釋放watch對某個key的監控。


浙公網安備 33010602011771號