可以一次執行多個命令,本質是一組命令的集合。
乙個事務中的 所有命令都會序列化,按順序地序列化執行而不會被其它命令插入,不許加塞。
乙個佇列中,一次性、順序性、排它性的執行一系列命令。
開啟:以multi開始乙個事務
入隊:將多個命令入隊到事務中,接到這些命令並不會立即執行,而是放到等待執行的事務佇列裡面
執行:由exec命令觸發事務
單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他客戶端傳送來的命令請求所打斷。
沒有隔離級別的概念:佇列中的命令沒有提交之前都不會實際的被執行,因為事務提交前任何指令都不會被實際執行, 也就不存在」事務內的查要看到事務裡的更新,在事務外查詢不能看到」這個讓人萬分頭痛的問題。
不保證原子性:redis同乙個事務中如果有一條命令執行失敗,其後的命令仍然會被執行,沒有回滾。
悲觀鎖/樂觀鎖悲觀鎖(pessimistic lock),
顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖
樂觀鎖(optimistic lock),
顧名思義,就是很樂觀,每次去拿資料的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個資料,可以使用版本號等機制。樂觀鎖適用於多讀的應用型別,這樣可以提高吞吐量,
樂觀鎖策略:提交版本必須大於記錄當前版本才能執行更新
先watch監控再開啟multi, 保證兩筆金額變動在同乙個事務內
watch監控了key,如果key被修改了,後面乙個事務的執行失效
一旦執行了exec之前加的監控鎖都會被取消掉了
watch指令,類似樂觀鎖,事務提交時,如果key的值已被別的客戶端改變, 比如某個list已被別的客戶端push/pop過了,整個事務佇列都不會被執行。
通過watch命令在事務執行之前監控了多個keys,倘若在watch之後有任何key的值發生了變化, exec命令執行的事務都將被放棄,同時返回nullmulti-bulk應答以通知呼叫者事務執行失敗。
redis事務 redis 優化
redis提供許多批量操作的命令,如mset mget hmset hmget等等,這些命令存在的意義是減少維護網路連線和傳輸資料所消耗的資源和時間。例如連續使用5次set命令設定5個不同的key,比起使用一次mset命令設定5個不同的key,效果是一樣的,但前者會消耗更多的rtt round tr...
Redis(十三)redis事務
redis作為乙個非關係型資料庫,其也是有事務操作的。redis 事務可以一次執行多個命令,並且帶有以下三個重要的保證 1 批量操作在傳送 exec 命令前被放入佇列快取。2 收到 exec 命令後進入事務執行,事務中任意命令執行失敗,其餘的命令依然被執行。3 在事務執行過程,其他客戶端提交的命令請...
redis11 Redis事務 事務鎖
一旦成功所有的成功,乙個失敗,所有一些列連續動作都失敗 事務的基本操作 multi exec 事務定義過程中發現問題,怎麼辦?discard 事務的工作流程 事務的注意事項 手動進行事務回滾 業務場景1 業務分析 基於特定條件的事務執行 鎖 解決方案 watch key1 key2 unwatch ...