1、基本介紹
是什么?
可以一次執(zhí)行多個命令,本質是一組命令的集合。一個事物中的所有命令都會被序列化,按順序的串行執(zhí)行而不會被其他命令插入,不許加塞。
能干嘛?
一個隊列中,一次性的,順序的,排他的執(zhí)行一系列命令。
怎么玩?
| 命令 | 描述 |
|---|---|
| multi | 標記一個事務的開始 |
| exec | 執(zhí)行所有事務塊內的命令 |
| discard | 取消事務,放棄執(zhí)行事務塊內的所有命令 |
| watch key [key] | 監(jiān)視一個(或多個) key ,如果在事務執(zhí)行之前這個(或這些) key 被其他命令所改動,那么事務將被打斷。 |
| unwatch | 取消watch命令對所有 key 的監(jiān)視。 |
- 正常執(zhí)行

- 放棄事務

- 全體連坐(一次出錯,全體命令不執(zhí)行)

- 冤頭債主(由此可見Redis只是部分支持事務)

2、watch監(jiān)控
悲觀鎖與樂觀鎖:鎖機制參考
watch指令,類似樂觀鎖,如果key的值已經被修改了,那么整個事務隊列都不會被執(zhí)行,同時返回一個Nullmulti-bulk應答以通知調用者事務執(zhí)行失敗。
注意:一旦執(zhí)行了exec或者discard,之前加的所有監(jiān)控鎖都會被取消掉了。
例子:
-
初始化信用卡的可用余額和欠額
-
無加塞篡改,先監(jiān)控再開啟multi,保證兩筆金額變動在同一個事務內
-
有加塞篡改,當watch的key被修改,后面的那個事務全部執(zhí)行失敗
unwatch,若在watch中key被修改,則先進行unwatch,然后重新watch監(jiān)控

3階段
- 開啟:以 multi 開啟事務;
- 入隊:將多個命令入隊到事務中,接到這些命令不會立刻執(zhí)行,而是放到等待執(zhí)行的事務隊列里面;
- 執(zhí)行:有 exec 命令觸發(fā)事務。
3特性
單獨的隔離操作:事務中的所有命令都會序列化,按順序的執(zhí)行。事務在等待執(zhí)行的時候,不會被其他客戶端發(fā)送來的米命令請求打斷。
沒有隔離級別的概念:隊列中的所有命令沒有提交exec之前都是不會被執(zhí)行的。
不保證原子性:redis中如果一條命令執(zhí)行失敗,其后的命令仍然會被執(zhí)行,沒有回滾,參考“冤頭債主”