Redis與MySQL中事務的區別
阿新 • • 發佈:2018-12-02
1、mysql中只有使用了
InnoDB
引擎的資料庫或表才支援事務;
2、使用“事務”的目的是:統一管理insert,update,delete
這些寫操作,以此來維護資料的完整性。
事務命令
mysql:
begin #顯式地開啟一個事務
commit #提交事務,對資料庫進行的所有寫操作變為永久性的
rollback #結束使用者的事務,並撤銷正在進行的所有未提交的寫操作
redis支援簡單的事務:
multi #標記事務的開始
exec #執行事務的commands佇列
discard #結束事務,並清除commands佇列
通過類比msyql來理解redis的事務命令,很顯然,它們有著本質區別。
redis和mysql事務的對比(不能回滾):
mysql redis
開啟 start transaction/begin multi
語句 SQL 命令
失敗 roolback回滾 discart取消
成功 commit提交 exec執行事務的命令佇列
roolback
和discard
的區別:
如果已經成功執行了2條語句,第3條語句出錯。roolback
後前面2條語句的影響小時;discard
只是結束本次事務,前面2條語句造成的影響仍然存在。
在multi
後面的語句出錯可能有兩種情況:
1、語法就有問題。(這種exec時報錯,所有語句都不執行)
2、語法本身沒有錯,但使用物件有問題。比如
zadd
命令操作link物件
,exec之後回執行正確的語句並跳過不適當的語句。
思考:悲觀鎖和樂觀鎖
我正在買票:
ticket -1;
money -100;
#票減1,錢減100
而如果票只有1張,如果在multi之後exec之前
,票被其他人買走了,即ticket變為0了。
我該如何觀察這種情況,並不在提交?
悲觀的想法:有人和我搶,給ticket加鎖,只有我能操作。(悲觀鎖)
樂觀的想法:我只需要注意有沒有人更改ticket的值就可以了。(樂觀鎖)
redis的事務中,啟動的是樂觀鎖,只負責監測key有沒有被改動
Redis Watch 命令
Redis Watch 命令用於監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那麼事務將被打斷
redis Watch 命令基本語法如下:
WATCH key [key ...]
還是結合上面買票
業務來理解:
redis> watch ticket #監視ticket這個key
OK
redis> multi #開啟事務
OK
redis> decr tickert #票減去1(注意我們這裡只有一張票)
QUEUED
redis> decrby monery 100
QUEUED
redis> exec
(nil) #返回nil說明監視的tiket已經改變了,事務就取消了