如果你了解過關(guān)系型數(shù)據(jù)庫(kù)事務(wù)的話,相信這篇文章對(duì)你來說是很容易理解的了。具體什么是事務(wù)我就不說不多了,直接講 redis 事務(wù)相關(guān)的部分。
首先,我們先來看下,Redis 是怎么執(zhí)行事務(wù)的。
1. 事務(wù)執(zhí)行過程
show code:
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set a test1
QUEUED
127.0.0.1:6379> set b test2
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
127.0.0.1:6379> get a
"test1"
127.0.0.1:6379> get b
"test2"
一個(gè)事務(wù)的開始到結(jié)束會(huì)經(jīng)過以下 3 個(gè)過程
- 事務(wù)開始
- 命令入隊(duì)
- 事務(wù)執(zhí)行
結(jié)合上面的例子,用人話介紹這 3 個(gè)過程就是:
Redis 執(zhí)行 multi 命令標(biāo)志事務(wù)開始。
當(dāng)客戶端切換至事務(wù)狀態(tài)后,服務(wù)端會(huì)將除了 exec、discard(取消事務(wù),放棄執(zhí)行事務(wù)塊內(nèi)的所有命令)、watch 和 multi 以外的命令放進(jìn)一個(gè)先進(jìn)先出的事務(wù)隊(duì)列中。即上面例子的 2 個(gè) set 命令會(huì)被放進(jìn)隊(duì)列,并返回 QUEUED 給客戶端。
當(dāng)客戶端發(fā)送 exec 命令時(shí),服務(wù)端會(huì)立即執(zhí)行該命令。遍歷這個(gè)客戶端的事務(wù)隊(duì)列,執(zhí)行隊(duì)列保存的所有命令。最后將執(zhí)行命令所得結(jié)果返回給客戶端。
2. Redis 事務(wù)和關(guān)系型事務(wù)的區(qū)別
兩者最大區(qū)別就是 Redis 事務(wù)不支持回滾。即使事務(wù)隊(duì)列中某個(gè)命令在執(zhí)行期間發(fā)生了錯(cuò)誤,事務(wù)也會(huì)繼續(xù)執(zhí)行,直到事務(wù)隊(duì)列中所有命令執(zhí)行完成。
文字貌似不夠直觀,沒事,看下面的例子你就馬上明白了。
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set msg test
QUEUED
127.0.0.1:6379> lpop msg
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> get msg
"test" // 不受后面錯(cuò)誤命令影響
PS:如果客戶端向事務(wù)入列一個(gè)錯(cuò)誤的命令(比如輸入一個(gè)不存在的命令,像:sett 命令),那么該事務(wù)將不被服務(wù)端執(zhí)行。該情況是入隊(duì)錯(cuò)誤,上面例子是執(zhí)行錯(cuò)誤的情況。
3. watch
提到 redis 事務(wù),就不得不提 watch 命令了。
該命令是一個(gè)樂觀鎖,只能在客戶端進(jìn)入事務(wù)狀態(tài)之前執(zhí)行。
作用是 exec 命令執(zhí)行之前,監(jiān)視任何數(shù)量個(gè)鍵,并在 exec 命令執(zhí)行時(shí),檢查被監(jiān)視的鍵是否至少有一個(gè)已經(jīng)被修改過。若是則拒絕執(zhí)行事務(wù),否則執(zhí)行。
當(dāng) exec 執(zhí)行完成后,這次事務(wù)也就結(jié)束了。
我們依舊來看一個(gè)簡(jiǎn)單的栗子:
127.0.0.1:6379> SET msg test //設(shè)置 msg 的值
OK
127.0.0.1:6379> WATCH msg //監(jiān)視 msg
OK
127.0.0.1:6379> SET msg test2 //修改 msg 的值(或其他客戶端在該客戶端執(zhí)行 exec 命令之前修改該值)
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET msg test3
QUEUED
127.0.0.1:6379> GET msg
QUEUED
127.0.0.1:6379> EXEC
(nil) //執(zhí)行失敗
原文地址:
https://www.cnblogs.com/czd-xi/p/16071242.html