事務(wù)在執(zhí)行時(shí),會(huì)提供專門的屬性保證随闪,包括原子性(Atomicity)阳似、一致性(Consistency)、隔離性(Isolation)和持久性(Durability)铐伴,也就是 ACID 屬性撮奏。
Redis 提供了 MULTI(開啟事務(wù))、EXEC (提交事務(wù))兩個(gè)命令來完成事務(wù)
原子性
1当宴,命令入隊(duì)時(shí)就報(bào)錯(cuò)畜吊,會(huì)放棄事務(wù)執(zhí)行,保證原子性户矢;
2玲献,命令入隊(duì)時(shí)沒報(bào)錯(cuò),實(shí)際執(zhí)行時(shí)報(bào)錯(cuò)梯浪,不保證原子性捌年;
3,EXEC 命令執(zhí)行時(shí)實(shí)例故障挂洛,如果開啟了 AOF 日志礼预,可以保證原子性。(使用 redis-check-aof 工具檢查 AOF 日志文件抹锄,這個(gè)工具可以把未完成的事務(wù)操作從 AOF 文件中去除。)荠藤。如果只有 RDB日志也沒問題伙单,RDB不會(huì)在事務(wù)執(zhí)行時(shí)執(zhí)行,所以 RDB 文件中不會(huì)記錄只執(zhí)行了一部分的結(jié)果數(shù)據(jù)哈肖。之后用 RDB 恢復(fù)實(shí)例數(shù)據(jù)吻育,恢復(fù)的還是事務(wù)之前的數(shù)據(jù)。
重點(diǎn)看第二點(diǎn):
#開啟事務(wù)
127.0.0.1:6379> MULTI
OK
#發(fā)送事務(wù)中的第一個(gè)操作淤井,LPOP命令操作的數(shù)據(jù)類型不匹配布疼,此時(shí)并不報(bào)錯(cuò)
127.0.0.1:6379> LPOP key1
QUEUED
#發(fā)送事務(wù)中的第二個(gè)操作
127.0.0.1:6379> DECR key2
QUEUED
#實(shí)際執(zhí)行事務(wù),事務(wù)第一個(gè)操作執(zhí)行報(bào)錯(cuò)
127.0.0.1:6379> EXEC
1) (error) WRONGTYPE Operation against a key holding the wrong kind of value
2) (integer) 8
執(zhí)行失敗Redis并不會(huì)回滾币狠;Redis 中并沒有提供回滾機(jī)制游两。雖然 Redis 提供了 DISCARD 命令,但是漩绵,這個(gè)命令只能用來主動(dòng)放棄事務(wù)執(zhí)行贱案,把暫存的命令隊(duì)列清空,起不到回滾的效果止吐。
補(bǔ)充:
redis 127.0.0.1:6379>type key
此時(shí)會(huì)顯示出該key存儲(chǔ)在現(xiàn)在redis服務(wù)器中的類型宝踪,例如:
redis 127.0.0.1:6379>hash
則表示key為以hash類型存儲(chǔ)在redis服務(wù)器里的侨糟,此時(shí)操作這個(gè)數(shù)據(jù)就必須使用hset、hget等操作方法瘩燥。
如果是zset如下:
redis 127.0.0.1:6379>zset
則表示數(shù)據(jù)類型為Sorted Sets的秕重。此時(shí)就需要使用zadd、zrange等操作方法厉膀,否則就會(huì)報(bào)WRONGTYPE Operation against a key holding the wrong kind of value這個(gè)錯(cuò)誤溶耘!
隔離性
1,并發(fā)操作在 EXEC 命令前執(zhí)行站蝠,此時(shí)汰具,隔離性的保證要使用 WATCH 機(jī)制來實(shí)現(xiàn),否則隔離性無法保證菱魔;
2留荔,并發(fā)操作在 EXEC 命令后執(zhí)行,此時(shí)澜倦,隔離性可以保證聚蝶。
WATCH 機(jī)制的作用是,在事務(wù)執(zhí)行前藻治,監(jiān)控一個(gè)或多個(gè)鍵的值變化情況碘勉,當(dāng)事務(wù)調(diào)用 EXEC 命令執(zhí)行時(shí),WATCH 機(jī)制會(huì)先檢查監(jiān)控的鍵是否被其它客戶端修改了桩卵。如果修改了验靡,就放棄事務(wù)執(zhí)行,避免事務(wù)的隔離性被破壞雏节。然后胜嗓,客戶端可以再次執(zhí)行事務(wù),此時(shí)钩乍,如果沒有并發(fā)修改事務(wù)數(shù)據(jù)的操作了辞州,事務(wù)就能正常執(zhí)行,隔離性也得到了保證寥粹。
持久性
如果 Redis 沒有使用 RDB 或 AOF变过,那么事務(wù)的持久化屬性肯定得不到保證。
而RBD快照時(shí)間比較長涝涤,就是AOF的everysec也是有1秒的數(shù)據(jù)丟失可能性媚狰,所以持久性屬性是得不到保證的。
一致性
一致性理解:應(yīng)用系統(tǒng)從一個(gè)正確的狀態(tài)到另一個(gè)正確的狀態(tài)阔拳,而ACID就是說事務(wù)能夠通過AID來保證這個(gè)C的過程哈雏。C是目的,AID都是手段。
既然手段達(dá)不到保障裳瘪,一致性也就沒什么談?wù)摰谋匾恕?/p>