Redis事務(wù)的概念:
Redis 事務(wù)的本質(zhì)是一組命令的集合。事務(wù)支持一次執(zhí)行多個命令些侍,一個事務(wù)中所有命令都會被序列化隶症。在事務(wù)執(zhí)行過程,會按照順序串行化執(zhí)行隊列中的命令岗宣,其他客戶端提交的命令請求不會插入到事務(wù)執(zhí)行命令序列中蚂会。
總結(jié)說:redis事務(wù)就是一次性、順序性耗式、排他性的執(zhí)行一個隊列中的一系列命令胁住。
Redis事務(wù)沒有隔離級別的概念:
批量操作在發(fā)送 EXEC 命令前被放入隊列緩存,并不會被實際執(zhí)行刊咳,也就不存在事務(wù)內(nèi)的查詢要看到事務(wù)里的更新彪见,事務(wù)外查詢不能看到。
Redis不保證原子性:
Redis中娱挨,單條命令是原子性執(zhí)行的余指,但事務(wù)不保證原子性,且沒有回滾跷坝。事務(wù)中任意命令執(zhí)行失敗酵镜,其余的命令仍會被執(zhí)行碉碉。
Redis事務(wù)的三個階段:
- 開始事務(wù)
- 命令入隊
- 執(zhí)行事務(wù)
Redis事務(wù)相關(guān)命令:
watch key1 key2 ... : 監(jiān)視一或多個key,如果在事務(wù)執(zhí)行之前,被監(jiān)視的key被其他命令改動淮韭,則事務(wù)被打斷 ( 類似樂觀鎖 )
multi : 標(biāo)記一個事務(wù)塊的開始( queued )
exec : 執(zhí)行所有事務(wù)塊的命令 ( 一旦執(zhí)行exec后誉裆,之前加的監(jiān)控鎖都會被取消掉 )
discard : 取消事務(wù),放棄事務(wù)塊中的所有命令
unwatch : 取消watch對所有key的監(jiān)控
Redis事務(wù)使用案例:
(1)正常執(zhí)行
(2)放棄事務(wù)
(3)若在事務(wù)隊列中存在命令性錯誤(類似于java編譯性錯誤)缸濒,則執(zhí)行EXEC命令時足丢,所有命令都不會執(zhí)行
(4)若在事務(wù)隊列中存在語法性錯誤(類似于java的1/0的運行時異常),則執(zhí)行EXEC命令時庇配,其他正確命令會被執(zhí)行斩跌,錯誤命令拋出異常。
(5)使用watch
案例一:使用watch檢測balance捞慌,事務(wù)期間balance數(shù)據(jù)未變動耀鸦,事務(wù)執(zhí)行成功
案例二:使用watch檢測balance,在開啟事務(wù)后(標(biāo)注1處)啸澡,在新窗口執(zhí)行標(biāo)注2中的操作袖订,更改balance的值,模擬其他客戶端在事務(wù)執(zhí)行期間更改watch監(jiān)控的數(shù)據(jù)嗅虏,然后再執(zhí)行標(biāo)注1后命令洛姑,執(zhí)行EXEC后,事務(wù)未成功執(zhí)行皮服。
一但執(zhí)行 EXEC 開啟事務(wù)的執(zhí)行后楞艾,無論事務(wù)使用執(zhí)行成功, WARCH 對變量的監(jiān)控都將被取消龄广。
故當(dāng)事務(wù)執(zhí)行失敗后硫眯,需重新執(zhí)行WATCH命令對變量進(jìn)行監(jiān)控,并開啟新的事務(wù)進(jìn)行操作择同。
** 總結(jié):**
watch指令類似于樂觀鎖两入,在事務(wù)提交時,如果watch監(jiān)控的多個KEY中任何KEY的值已經(jīng)被其他客戶端更改敲才,則使用EXEC執(zhí)行事務(wù)時裹纳,事務(wù)隊列將不會被執(zhí)行,同時返回Nullmulti-bulk應(yīng)答以通知調(diào)用者事務(wù)執(zhí)行失敗归斤。