redis學習之七 事務與樂觀鎖

2021-08-20 10:05:21 字數 1458 閱讀 8347

1、redis與 mysql事務的對比:

mysql

redis

開啟start transaction

multi

語句普通sql

普通命令

失敗rollback 回滾

discard 取消

成功commit

exec

2、rollback與discard 的區別:

如果已經成功執行了2條語句, 第3條語句出錯.

rollback後,前2條的語句影響消失.

discard只是結束本次事務,前2條語句造成的影響仍然還在

3、在mutil後面的語句中, 語句出錯可能有2種情況

1: 語法就有問題, exec時,報錯, 所有語句得不到執行

2: 語法本身沒錯,但適用物件有問題. 比如 zadd 操作list物件,exec之後,會執行正確的語句,並跳過有不適當的語句.(如果zadd  操作list這種事怎麼避免? 這一點,由程式設計師負責)

比如: set zhangsan 700   set lisi 200     multi   decrby zhangsan 100  incr lisi 100     exec   此時 incr lisi 100   語法出錯,兩條語句都不能執行,zhangsan: 700, lisi: 200

set zhangsan 700   set lisi 200     multi   decrby zhangsan 100  sadd lisi 100     exec   此時 sadd lisi 100   錯將lisi作為集合執行,exec後跳過此句,zhangsan: 600, lisi: 200

4、redis的樂觀鎖:(watch)

思考: 

我正在買票

ticket -1 , money -100

而票只有1張, 如果在我multi之後,和exec之前, 票被別人買了---即ticket變成0了.

我該如何觀察這種情景,並不再提交

悲觀的想法: 

世界充滿危險,肯定有人和我搶, 給 ticket上鎖, 只有我能操作. [悲觀鎖]

樂觀的想法:

沒有那麼人和我搶,因此,我只需要注意,

--有沒有人更改ticket的值就可以了 [樂觀鎖]

redis的事務中,啟用的是樂觀鎖,只負責監測key沒有被改動.

具體的命令----  watch命令

例: watch ticket

multi

decr ticket

decrby money 100   若此時在另乙個埠中執行decr ticket,改變了ticket 

exec     // 返回nil,說明監視的ticket已經改變了,事務就取消了.

(2)watch key1 key2  ... keyn:監聽key1 key2..keyn有沒有變化,如果有變, 則事務取消

(3)unwatch : 取消所有watch監聽

redis 樂觀鎖與事務

一 樂觀鎖 先表明態度,樂觀鎖並不是乙個好的實現方式!在mysql中,我們一般通過給資料表額外建乙個version欄位,讀的時候讀出verson,更新的時候 v2 versin 1,語句為 update set version version 1 where id and version v2 只要...

Redis 事務(悲觀鎖 樂觀鎖)

1 定義 redis事務是乙個單獨的隔離操作 事務中所有的命令都會被序列化 按照順序執行 事務在執行過程中不會被其他客戶端傳送來的命令請求打斷 2 作用 串聯多個命令防止別的命令插隊 multi 輸入開始命令 exec 執行命令 discard 放棄組隊 刪除掉 3 注意事項 1 multi 命令不...

Redis 樂觀鎖控制事務

redis對事務的支援比較簡單。redis只能保證乙個客戶端發起的事務命令可以執行,中間不會插入其他事務。因為redis是單執行緒的,所以做到上面這點很容易。一般redis接受到客戶端的命令後會立即執行,但是如果客戶端發起multi命令,redis不會立即執行,而是讓當前連線進入事務上下文,把命令放...