新聞中心
redis支持簡(jiǎn)單的事務(wù)
創(chuàng)新互聯(lián)公司主要從事網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)嘉魚,十年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):13518219792
Redis與 MySQL事務(wù)的對(duì)比
注: rollback與discard 的區(qū)別
如果已經(jīng)成功執(zhí)行了2條語(yǔ)句, 第3條語(yǔ)句出錯(cuò).
Rollback后,前2條的語(yǔ)句影響消失.
Discard只是結(jié)束本次事務(wù),前2條語(yǔ)句造成的影響仍然還在
注:
在mutil后面的語(yǔ)句中, 語(yǔ)句出錯(cuò)可能有2種情況
1: 語(yǔ)法就有問(wèn)題,
這種,exec時(shí),報(bào)錯(cuò), 所有語(yǔ)句得不到執(zhí)行
2: 語(yǔ)法本身沒(méi)錯(cuò),但適用對(duì)象有問(wèn)題. 比如 zadd 操作list對(duì)象
Exec之后,會(huì)執(zhí)行正確的語(yǔ)句,并跳過(guò)有不適當(dāng)?shù)恼Z(yǔ)句.
(如果zadd操作list這種事怎么避免? 這一點(diǎn),由程序員負(fù)責(zé))
(使用multi后,并沒(méi)有真正執(zhí)行,而是放到一個(gè)queued(隊(duì)列)里,exec后才會(huì)執(zhí)行)
(discard之后啥都沒(méi)變,因?yàn)橹皇欠旁陉?duì)列里。嚴(yán)格的說(shuō)只能叫取消,不能叫回滾)
思考:
我正在買票
Ticket -1 , money -100
而票只有1張, 如果在我multi之后,和exec之前, 票被別人買了---即ticket變成0了.
我該如何觀察這種情景,并不再提交
悲觀的想法:
世界充滿危險(xiǎn),肯定有人和我搶, 給 ticket上鎖, 只有我能操作. [悲觀鎖]
樂(lè)觀的想法:
沒(méi)有那么人和我搶,因此,我只需要注意,
--有沒(méi)有人更改ticket的值就可以了 [樂(lè)觀鎖]
Redis的事務(wù)中,啟用的是樂(lè)觀鎖,只負(fù)責(zé)監(jiān)測(cè)key沒(méi)有被改動(dòng).
具體的命令---- watch命令
例:
redis 127.0.0.1:6379> watch ticket (監(jiān)控ticket,如果發(fā)生了變化,則執(zhí)行不成功)
OK
redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> decr ticket
QUEUED
redis 127.0.0.1:6379> decrby money 100
QUEUED
redis 127.0.0.1:6379> exec
(nil) // 返回nil,說(shuō)明監(jiān)視的ticket已經(jīng)改變了,事務(wù)就取消了.
redis 127.0.0.1:6379> get ticket
"0"
redis 127.0.0.1:6379> get money
"200"
watch key1 key2 ... keyN
作用:監(jiān)聽(tīng)key1 key2..keyN有沒(méi)有變化,如果有變, 則事務(wù)取消
unwatch
作用: 取消所有watch監(jiān)聽(tīng)
分享名稱:Redis中的事務(wù)/鎖
文章路徑:http://fisionsoft.com.cn/article/jjcidg.html