redis事務(wù)的本質(zhì)是一組命令的集合媳维。事務(wù)支持一次執(zhí)行多個命令酿雪,一個事務(wù)中所有的命令都會被序列化。在執(zhí)行事務(wù)的過程中侄刽,會按照順序串行化執(zhí)行隊列中的命令,其他客戶端提交的命令請求不會插入到事務(wù)執(zhí)行命令序列中州丹。簡單來說醋安,redis的事務(wù)是一次性杂彭、順序性、排他性的吓揪。
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)控
watch指令類似于樂觀鎖厢破,在事務(wù)提交時荣瑟,如果watch監(jiān)控的多個KEY中任何KEY的值已經(jīng)被其他客戶端更改,則使用EXEC執(zhí)行事務(wù)時摩泪,事務(wù)隊列將不會被執(zhí)行笆焰,同時返回Nullmulti-bulk應(yīng)答以通知調(diào)用者事務(wù)執(zhí)行失敗。