1、定義:
redis事務是乙個單獨的隔離操作2、作用:①事務中所有的命令都會被序列化、按照順序執行
②事務在執行過程中不會被其他客戶端傳送來的命令請求打斷
串聯多個命令防止別的命令插隊multi:輸入開始命令
exec:執行命令
discard:放棄組隊(刪除掉)
3、注意事項:1、multi 命令不能巢狀使用,如果已經開啟了事務的情況下,再執行 multi 命令,會提示如下錯誤:
但是這個錯誤不會使事務終止127.0
.0.1:6379
> multi
ok127.0
.0.1:6379
> multi
(error) err multi calls can not be nested //這裡報錯不會使事務終止
127.0
.0.1:6379
>
set a 100
queued
127.0
.0.1:6379
>
exec
1) ok
2、 如果在組隊**現了報告錯誤,執行時整個佇列都會被取消掉(當前事務就會終止), 比如multi巢狀就是組隊的時候報告錯誤
3、 如果在執行階段某個命令出現錯誤,只有報錯的命令不會被執行,其他的命令照常執行,不會回滾
4、悲觀鎖:127.0
.0.1:6379
> multi //開啟事務
ok127.0
.0.1:6379
>
set a 123
queued
127.0
.0.1:6379
> lpop a //使用list命令操作set型別
queued
127.0
.0.1:6379
>
exec
//執行
1) ok //正常的命令執行成功2)
(error) wrongtype operation against a key holding the wrong kind of
value
//錯誤的命令執行失敗
.樂觀鎖:每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖 ,這樣別人想拿這個資料就會block(阻塞)直到他拿到鎖
傳統的關係型資料庫裡面就是用到了很多這樣的鎖機制 (行鎖、表鎖、讀鎖、寫鎖都是在操作之前先上鎖)
每次去拿資料的時候都認為別人不會修改,所以不會上鎖 ,但是在更新的時候會判斷一下在此期間別人會不會更新這個資料,可以用版本號等機制.例:5、常用命令:比如當前有乙個人,想修改一張5000塊的銀行卡,卡的版本名為v1,他修改完成後順便將銀行卡改個版本名字叫v2,那麼當另外乙個人來修改這個版本名為v1這張卡的時候,就發現沒有v1這張卡,不是不存在,是因為已經被上乙個人將版本名v1改為v2了。
.樂觀鎖適用於多讀的應用型別,提高吞吐量
redis就是利用這種check-and-set機制實現事務的
watch key [key…]:6、redis事務三大特性:在執行multi之前,先執行watch key1 【key2】,可以監視乙個或者多個key,如果在事務執行之前這個(或這些)key被其他命令所改動,那麼事務將被打斷,(但是,相同的客戶端可能會在事務內部修改這些鍵,此時這個事務不會中止執行。)否則,redis根本就不會進入事務。類似於樂觀鎖得機制,我不上鎖,但是你修改不了,只能我自己改,我自己改,毫無影響,你要硬來改,我就報錯。
.unwatch
取消wtach命令對所有key的監視,如果在執行watch命令之後,exec命令或者discard命令先被執行了的話,那麼就不需要再執行unwatch命令了
.7、redis事務秒殺場景問題1、單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他客戶端傳送來的命令請求所打斷。
.2、沒有隔離級別的概念:佇列中的命令沒有提交之前都不會實際的被執行,因為事務提交前任何指令都不會被實際執行,也就不存在」事務內的查詢要看到事務裡的更新,在事務外查詢不能看到」這個讓人萬分頭痛的問題
.3、不保證原子性:redis同乙個事務中如果有一條命令執行失敗,其後的命令仍然會被執行,沒有回滾
秒殺1、解決超賣問題:主要是通過 watch 監視 ,利用watch的特性,監視的值發生變化,事務就終止
.2、庫存遺留問題:利用lua指令碼
Redis09 事務(悲觀鎖 樂觀鎖)
redis事務是乙個單獨的隔離操作 事務中所有的命令都會被序列化 按照順序執行 事務在執行過程中不會被其他客戶端傳送來的命令請求打斷 串聯多個命令防止別的命令插隊 每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖 這樣別人想拿這個資料就會block 阻塞 直到他拿到鎖 傳統的關係型...
Redis鎖,悲觀鎖和樂觀鎖
樂觀鎖開啟事務前,設定對資料的監聽 watch exec時,如果發生資料發生過修改,作用於改資料的事務會自動取消 discard 事務exec後,無論成敗,監聽會被移除 悲觀鎖每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖。場景 如果專案中使用了快取且對快取設定了超時時間。當併發...
Redis事務 樂觀鎖和悲觀鎖詳細介紹
mysql acid。要麼同時成功,要麼同時失敗。redis事務本質 一組命令的集合。乙個事務中的所有命令都會被序列化,在事務執行過程中,會按照順序執行。一次性,順序性,排他性,執行一系列的命令。redis事務沒有隔離級別的概念 所有的命令在事務中,並沒有直接被執行。只有發起執行命令的時候才會執行。...