目錄
- 簡介
- 執行過程
- 特點
- 案例
- watch
簡介
事務(Transaction),一般是指要做的或所做的事情。在計算機術語中是指訪問並可能更新資料庫中各種資料項的一個程式執行單元(unit)。
執行過程
開始事務 -> 命令入隊 -> 執行事務。
特點
① 批量操作在傳送 exec
命令前被放入佇列快取。
② 收到exec
命令後進入事務執行,事務中任意命令執行失敗,其餘的命令依然會被執行。
③ 在事務的執行過程中,其他客戶端提交的命令請求不會插入到事務執行命令的序列中。
案例:
-
(1)正常執行
localhost:6379> multi OK localhost:6379> set a 1111 QUEUED localhost:6379> set b 2222 QUEUED localhost:6379> set c 3333 QUEUED localhost:6379> set d 4444 QUEUED localhost:6379> exec 1) OK 2) OK 3) OK 4) OK
-
(2)取消事務
localhost:6379> multi OK localhost:6379> set e 55555 QUEUED localhost:6379> set f 66666 QUEUED localhost:6379> discard OK localhost:6379> exec (error) ERR EXEC without MULTI
-
(3)編譯型錯誤
最後執行exec
命令之後,會執行佇列中的命令,佇列中命令有失敗的,所以最後整個命令都執行失敗。
編譯型異常程式碼有問題,命令有錯,事務中所有的命令都不會被執行。 -
(4)執行時錯誤
localhost:6379> set a qqqq OK localhost:6379> multi OK localhost:6379> incr a QUEUED localhost:6379> set b 1111 QUEUED localhost:6379> set c 2222 QUEUED localhost:6379> set d 3333 QUEUED localhost:6379> exec 1) (error) ERR value is not an integer or out of range 2) OK 3) OK 4) OK localhost:6379> keys * 1) "a" 2) "c" 3) "b" 4) "d"
如果事務佇列存在語法錯誤,那麼執行命令的時候,其他命令是可以正常執行的,錯誤命令丟擲異常。
watch
Watch 命令用於監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那麼事務將被打斷。
- 監控
a
時,a
被修改//客戶端1 localhost:6379> set a 1111 OK localhost:6379> WATCH a OK localhost:6379> MULTI OK localhost:6379> set a 2222 QUEUED localhost:6379> exec (nil) //客戶端2 127.0.0.1:6379> set a 567 OK
- 正常
watch
localhost:6379> set a 1111 OK localhost:6379> WATCH a OK localhost:6379> MULTI OK localhost:6379> set b 222 QUEUED localhost:6379> set c 333 QUEUED localhost:6379> set d 444 QUEUED localhost:6379> exec 1) OK 2) OK 3) OK localhost:6379> keys * 1) "a" 2) "c" 3) "b" 4) "d"