EXEC返回一個數(shù)組其中每個元素都是事務中單個命令的返回結果而且順序與命令的發(fā)出順序相同 。當Redis連接處于MULTI請求的上下文中時所有命令將以字符串QUEUED(從Redis協(xié)議的角度作為狀態(tài)回復發(fā)送)作為回復并在命令隊列中排隊 。只有EXEC被調用時排隊的命令才會被執(zhí)行此時才會有真正的返回結果 。
事務中的錯誤 事務期間可能會遇到兩種命令錯誤:
在調用 EXEC命令之前出現(xiàn)錯誤( COMMAND排隊失?。?。例如命令可能存在 語法錯誤(參數(shù)數(shù)量錯誤錯誤的命令名稱...);或者可能存在 某些關鍵條件如內存不足的情況(如果服務器使用 maxmemory指令做了 內存限制) 。 。通過檢查排隊命令的狀態(tài)回復(***注意:這里是指排隊的狀態(tài)回復而不是執(zhí)行結果***)如果命令使用QUEUED進行響應則它已正確排隊否則Redis將返回錯誤 。如果排隊命令時發(fā)生錯誤大多數(shù)客戶端將中止該事務并清除命令隊列 。然而:
在 Redis 2.6.5之前這種情況下在 EXEC命令調用后客戶端會執(zhí)行命令的子集(成功排隊的命令)而忽略之前的錯誤 。從 Redis 2.6.5開始服務端會記住在累積命令期間發(fā)生的錯誤當 EXEC命令調用時 將拒絕執(zhí)行事務并返回這些錯誤同時自動清除命令隊列 。示例如下: >MULTI+OK>INCR a b c-ERR wrong number of arguments for 'incr' command
這是由于在調用INCR命令的語法錯誤將在調用EXEC之前被檢測出來并終止事務(version2.6.5+) 。
EXEC命令之后出現(xiàn)錯誤 。例如使用 錯誤的值對某個 key執(zhí)行操作(如針對 String值調用 List操作) :即使事務中的某些命令執(zhí)行失敗其他命令仍會被正常執(zhí)行 。示例如下: >MULTI+OK>SET a 3+QUEUED>LPOP a+QUEUED>EXEC*2+OK-ERR Operation against a key holding the wrong kind of value
Redis事務不支持Rollback(EXEC返回一個包含兩個元素的字符串數(shù)組一個元素是OK另一個是-ERR……。能否將錯誤合理的反饋給用戶這取決于客戶端library(如:Spring-data-redis.redisTemplate)的自身實現(xiàn) 。需要注意的是即使命令失敗隊列中的所有其他命令也會被處理----Redis不會停止命令的處理 。
重點) 事實上Redis命令在事務執(zhí)行時可能會失敗但仍會繼續(xù)執(zhí)行剩余命令而不是Rollback(事務回滾) 。如果你使用過關系數(shù)據(jù)庫這種情況可能會讓你感到很奇怪 。然而針對這種情況具備很好的解釋:Redis命令可能會執(zhí)行失敗僅僅是由于錯誤的語法被調用(命令排隊時檢測不出來的錯誤)或者使用錯誤的數(shù)據(jù)類型操作某個 Key: 這意味著實際上失敗的命令都是編程錯誤造成的都是開發(fā)中能夠被檢測出來的生產(chǎn)環(huán)境中不應該存在 。(這番話徹底甩鍋“都是你們自己編程錯誤與我們無關” 。)由于不必支持 Rollback, Redis內部簡潔并且更加高效 ?!叭绻e誤就是發(fā)生了呢”這是一個反對Redis觀點的爭論 。然而應該指出的是通常情況下回滾并不能挽救編程錯誤 。鑒于沒有人能夠挽救程序員的錯誤并且Redis命令失敗所需的錯誤類型不太可能進入生產(chǎn)環(huán)境所以我們選擇了不支持錯誤回滾(Rollback)這種更簡單快捷的方法 。
以上關于本文的內容,僅作參考!溫馨提示:如遇健康、疾病相關的問題,請您及時就醫(yī)或請專業(yè)人士給予相關指導!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內容,希望對您有所幫助:- 互聯(lián)網(wǎng)常識:javascript中string方法有哪些
- 互聯(lián)網(wǎng)常識:mysql8 phpmyadmin密碼登錄失敗怎么辦
- 榮耀Magic4系列詳細參數(shù)對比 榮耀Magic4系列哪款更值得購買
- 雅姿官網(wǎng)查詢詳細價格 安利眼霜產(chǎn)品價格表
- 互聯(lián)網(wǎng)常識:javascript如何設置顏色
- 榮耀x20手機參數(shù)配置詳情 榮耀30參數(shù)詳細參數(shù)
- 關于五的文化常識
- T3出行離職1萬元押金給退嗎
- 居家風水常識
- 解析互聯(lián)網(wǎng)六大商業(yè)模式 互聯(lián)網(wǎng)盈利模式包括哪些模式
