Redis 中的事務

2021-07-23 03:36:17 字數 1851 閱讀 7355

redis支援簡單的事務

redis與 

mysql

事務的對比

mysql

redis

開啟start transaction

muitl

語句普通sql

普通命令

失敗rollback 回滾

discard 取消

成功commit

exec

注: rollback

與discard 

的區別如果已經成功執行了2

條語句, 第3

條語句出錯

.rollback後,前

2條的語句影響消失

.discard只是結束本次事務,前

2條語句造成的影響仍然還在

注:在mutil

後面的語句中

, 語句出錯可能有

2種情況

1: 語法就有問題

, 這種,exec時,

報錯, 

所有語句得不到執行

2: 語法本身沒錯

,但適用物件有問題

. 比如 

zadd 

操作list

物件exec之後

,會執行正確的語句

,並跳過有不適當的語句

. (如果

zadd

操作list

這種事怎麼避免

? 這一點

,由程式設計師負責)

思考: 

我正在買票

ticket -1 , money -100

而票只有1張, 

如果在我

multi之後,

和exec

之前, 

票被別人買了

---即

ticket變成0

了.我該如何觀察這種情景,

並不再提交

悲觀的想法: 

世界充滿危險,

肯定有人和我搶

, 給 

ticket

上鎖, 

只有我能操作

. [悲觀鎖

] 樂觀的想法:

沒有那麼人和我搶,因此,

我只需要注意

,--有沒有人更改

ticket

的值就可以了 

[樂觀鎖

] redis的事務中

,啟用的是樂觀鎖

,只負責監測

key沒有被改動.

具體的命令----  watch

命令例: 

redis 127.0.0.1:6379> watch ticket

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,

說明監視的

ticket

已經改變了

,事務就取消了

.redis 127.0.0.1:6379> get ticket

"0"redis 127.0.0.1:6379> get money

"200"

watch key1 key2  ... keyn

作用:監聽key1 key2..keyn

有沒有變化

,如果有變

, 則事務取消

unwatch 

作用: 

取消所有

watch

監聽

Redis中的事務

flushall清除所有的鍵值 1 multi 開啟事務,事務塊中的多條語句會按照順序放入佇列中。multi incr counter1 incr counter2 incr counter3 ping get counter1 2 exec 執行事務塊中的命令 3 watch 監視乙個或者多個ke...

redis中的事務

redis支援簡單的事務 redis與 mysql事務的對比 mysql redis 開啟 start transaction muitl 語句 普通sql 普通命令 失敗 rollback 回滾 discard 取消 成功 commit exec 注 rollback與discard 的區別 如果...

redis中的事務

redis 中的事務 redis支援簡單的事務redis與 mysql事務的對比 mysql redis 開啟 start transaction muitl 語句 普通sql 普通命令 失敗 rollback 回滾 discard 取消 成功 commit exec 注 rollback與disc...