天天看點

【Redis】事務:事務操作、放棄事務、兩類事務錯誤;Watch:實作樂觀鎖

文章目錄

    • 1 Redis 事務
      • 1.1 介紹
      • 1.2 事務操作
      • 1.3 放棄事務
      • 1.4 事務錯誤
    • 2 樂觀鎖
      • 2.1 介紹
      • 2.2 監視 key

1 Redis 事務

1.1 介紹

單個 Redis 指令的執行是原子性的,但 Redis 沒有在事務上增加任何維持原子性的機制,是以 Redis 事務的執行并不是原子性的。

事務可以了解為一個打包的批量執行腳本,但批量指令并非原子化的操作,中間某條指令的失敗不會導緻前面已做指令的復原,也不會造成後續的指令不做。

【Redis】事務:事務操作、放棄事務、兩類事務錯誤;Watch:實作樂觀鎖

1.2 事務操作

具體實踐:開始事務、指令入隊、執行事務

【Redis】事務:事務操作、放棄事務、兩類事務錯誤;Watch:實作樂觀鎖

1.3 放棄事務

【Redis】事務:事務操作、放棄事務、兩類事務錯誤;Watch:實作樂觀鎖

1.4 事務錯誤

若是在指令編譯階段報錯,則事務中所有指令都不會執行,如下:

【Redis】事務:事務操作、放棄事務、兩類事務錯誤;Watch:實作樂觀鎖

若是在指令運作階段報錯,則其他指令都可以正常執行,僅那條報錯的指令不會生效,如下:

【Redis】事務:事務操作、放棄事務、兩類事務錯誤;Watch:實作樂觀鎖

是以,Redis 中的事務沒有原子性的特性。

2 樂觀鎖

2.1 介紹

(下面是 B站UP主-遇見狂神說 對于這兩種鎖的解釋,我并不認為解釋的多嚴謹,但是卻相當的簡潔和形象,是以截圖記錄在本文)

【Redis】事務:事務操作、放棄事務、兩類事務錯誤;Watch:實作樂觀鎖

2.2 監視 key

Redis Watch 指令可實作樂觀鎖,Watch 用于監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他指令所改動,那麼事務将被打斷(是以,在 Redis 中,給字段加樂觀鎖用 Watch 指令就可以)。

下圖為,事務執行時,即 EXEC 指令後,被監視的 money 沒被其他操作修改的情況:

【Redis】事務:事務操作、放棄事務、兩類事務錯誤;Watch:實作樂觀鎖

下圖為,事務執行時,即 EXEC 指令後,被監視的 money 被其他操作修改的情況:

【Redis】事務:事務操作、放棄事務、兩類事務錯誤;Watch:實作樂觀鎖

之後,若還想監視 money,并且希望可以執行相應指令,則需要更新 money 在監視環境中的值,即先解除監視,再重新監視

【Redis】事務:事務操作、放棄事務、兩類事務錯誤;Watch:實作樂觀鎖
【Redis】事務:事務操作、放棄事務、兩類事務錯誤;Watch:實作樂觀鎖