Redis 中的事務 鎖 09

2021-08-02 16:19:10 字數 3224 閱讀 3320

redis 中的事務

mysql與redis的區別

mysql	    				redis

開啟 start transaction muitl

語句 普通sql 普通命令

失敗 rollback 回滾 discard 取消

成功 commit exec

127.0.0.1:6379> set num1 200

ok127.0.0.1:6379> set num2 400

ok127.0.0.1:6379> multi

ok127.0.0.1:6379> decrby num2 100

--將語句儲存在佇列queued中,不執行,只有exec才從佇列中拿出來執行

queued

127.0.0.1:6379> incrby num1 100

queued

127.0.0.1:6379> exec

1) (integer) 300

2) (integer) 300

注意:

1 rollback與discard 的區別

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

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

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

127.0.0.1:6379> set num1 200

ok127.0.0.1:6379> set num2 400

ok127.0.0.1:6379> multi

ok127.0.0.1:6379> incrby num1 100

queued

127.0.0.1:6379> decrby num2 aa

queued

127.0.0.1:6379> exec

1) (integer) 300

2) (error) err value is not an integer or out of range

127.0.0.1:6379> get num1

"300"

127.0.0.1:6379> get num2

"400"

127.0.0.1:6379>

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

1: 語法就有問題,

執行exec時,報錯, 所有語句得不到執行

127.0.0.1:6379> set num1 200

ok127.0.0.1:6379> set num2 400

ok127.0.0.1:6379> multi

ok127.0.0.1:6379> incrby num1 100

queued

127.0.0.1:6379> asdad

(error) err unknown command 'asdad'

127.0.0.1:6379> exec

(error) execabort transaction discarded because of previous errors.

127.0.0.1:6379> get num1

"200"

127.0.0.1:6379> get num2

"400"

2: 語法本身沒錯,但適用物件有問題. 比如set num2 40;decrby num2 aa

exec之後,會執行正確的語句,並跳過有不適當的語句.

127.0.0.1:6379> set num1 200

ok127.0.0.1:6379> set num2 400

ok127.0.0.1:6379> multi

ok127.0.0.1:6379> incrby num1 100

queued

127.0.0.1:6379> decrby num2 aa

queued

127.0.0.1:6379> exec

1) (integer) 300

2) (error) err value is not an integer or out of range

127.0.0.1:6379> get num1

"300"

127.0.0.1:6379> get num2

"400"

127.0.0.1:6379>

redis事務過程:

multi:告訴程式,下面的命令先不要執行,暫時存起來

queued:該命令進入等待執行的事務佇列中

exec:執行事務佇列的命令,按順序執行,順序返回每條命令的執行結果。

redis的事務中,啟用的是樂觀鎖,只負責監測key沒有被改動.有改動,執行的事務就不成功。

語法watch key1 key2 …

監控乙個或多個鍵,一旦有乙個鍵被修改或者刪除(除了鍵到期自動刪除外),之後事務就不執行,監控一直持續到exec命令

案列買票

--當前票數為1

127.0.0.1:6379> set ticket 1

ok--使用者a的錢500

127.0.0.1:6379> set money 500

ok--設定鎖,如果票數發生變化,下面的事務不執行

127.0.0.1:6379> watch ticket

ok127.0.0.1:6379> multi

ok127.0.0.1:6379> decr ticket

queued

127.0.0.1:6379> decrby money 100

queued

--在exec之前,另乙個使用者b購買了票數,之後當前使用者a執行exec

127.0.0.1:6379> exec

(nil)--表示使用者a的事務沒有生效

另乙個使用者b,在使用者a exec之前,先買了票

127.0.0.1:6379> decr ticket

(integer) 0

127.0.0.1:6379>

Redis09 事務(悲觀鎖 樂觀鎖)

redis事務是乙個單獨的隔離操作 事務中所有的命令都會被序列化 按照順序執行 事務在執行過程中不會被其他客戶端傳送來的命令請求打斷 串聯多個命令防止別的命令插隊 每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖 這樣別人想拿這個資料就會block 阻塞 直到他拿到鎖 傳統的關係型...

Redis事務 事務鎖

一旦成功所有的成功,乙個失敗,所有一些列連續動作都失敗 事務的基本操作 注意 加入事務的命令暫時到任務佇列中,並沒有立即執行,只有執行exec命令才開始執行事務定義過程中發現問題,怎麼辦?discard 事務的工作流程 事務的注意事項 手動進行事務回滾 業務場景1 業務分析 基於特定條件的事務執行 ...

redis11 Redis事務 事務鎖

一旦成功所有的成功,乙個失敗,所有一些列連續動作都失敗 事務的基本操作 multi exec 事務定義過程中發現問題,怎麼辦?discard 事務的工作流程 事務的注意事項 手動進行事務回滾 業務場景1 業務分析 基於特定條件的事務執行 鎖 解決方案 watch key1 key2 unwatch ...