事務(Transaction),通常是指要作的或所作的事情。在計算機術語中是指訪問並可能更新數據庫中各類數據項的一個程序執行單元(unit)。java
開始事務 -> 命令入隊 -> 執行事務。redis
① 批量操做在發送 exec
命令前被放入隊列緩存。
② 收到exec
命令後進入事務執行,事務中任意命令執行失敗,其他的命令依然會被執行。
③ 在事務的執行過程當中,其餘客戶端提交的命令請求不會插入到事務執行命令的序列中。shell
(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
命令以後,會執行隊列中的命令,隊列中命令有失敗的,因此最後整個命令都執行失敗。
編譯型異常代碼有問題,命令有錯,事務中全部的命令都不會被執行。code
(4)運行時錯誤blog
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 命令用於監視一個(或多個) 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"