首頁>技術>

說到資料庫事務,我們難免會有個對比,作為NoSQL的Redis與關係型資料庫比如MySQL或者Oracle的事務是不是一個概念呢?

關係型資料庫事務的概念:

主要是四個特性:原子性、一致性、隔離性、永續性。(如果對此有疑惑,我將在後續文章中詳細講解)

Redis事務的概念:

Redis事務的本質是一組命令的集合。事務支援一次執行多個命令,一個事務中所有命令都會被序列化。在事務執行過程,會按照順序序列化執行佇列中的命令,其他客戶端提交的命令請求不會插入到事務執行命令序列中。即redis事務的特性為:一次性、順序性、排他性三個特徵,以保證執行佇列中的一系列命令。  

Redis事務執行會經歷的三個階段:開始事務、命令入隊、執行事務。

Redis事務相關命令:

1.watch key1 key2 ... : 監視一或多個key,如果在事務執行之前,被監視的key被其他命令改動,則事務被打斷 ( 類似樂觀鎖 )

2.multi : 標記一個事務塊的開始( queued )

3.exec : 執行所有事務塊的命令 ( 一旦執行exec後,之前加的監控鎖都會被取消掉 ) 

4.discard : 取消事務,放棄事務塊中的所有命令

5.unwatch : 取消watch對所有key的監控

舉例(正常執行):

執行命令截圖如下:

Redis正常事務命令舉例

Redis正常事務命令程式碼:set key1 100watch key1multiset key1 aexecget key1
Redis事務使用案例:

(1)正常執行(multi...exec);

(2)放棄事務(multi...discard);

(3)若在事務佇列中存在命令性錯誤(類似於java邏輯錯誤),則執行EXEC命令時,所有命令都不會執行;

(4)若在事務佇列中存在語法性錯誤(類似於JAVA執行時異常),則執行EXEC命令時,其他正確命令會被執行,錯誤命令丟擲異常,之前已經執行的命令不會回滾

(5)使用watch命令(watch key... multi ... exec unwatch)

Redis事務可以一次執行多個命令,自帶以下三個重要的保證:

1.批次操作在傳送 EXEC 命令前被放入佇列快取;

2.收到EXEC命令後進入事務執行,事務中任意命令執行失敗,其餘的命令依然被執行;

3.在事務執行過程,其他客戶端提交的命令請求不會插入到事務執行命令序列中。

關於Redis事務特別注意以下幾點:

一、關於隔離級別

Redis事務沒有隔離級別的概念,批次操作在傳送 EXEC 命令前被放入佇列快取,並不會被實際執行,也就不存在事務內的查詢要看到事務裡的更新,事務外查詢不能看到。

二、關於原子性

Redis不保證原子性,單條命令是原子性執行的,但事務不保證原子性,且沒有回滾,事務中任意命令執行失敗,其餘的命令仍會被執行。

三、一旦執行EXEC開啟事務的執行後,無論事務使用執行成功, WATCH 對變數的監控都將被取消。故當事務執行失敗後,需重新執行WATCH命令對變數進行監控,並開啟新的事務進行操作。

特此總結:

1.由於事務在EXEC命令被呼叫之前不會執行任何實際操作,所以使用者將沒有辦法根據根據讀到的資料來做決定。

2.Redis不支援已被執行命令的回滾。

3.watch指令類似於樂觀鎖,在事務提交時,如果watch監控的多個KEY中任何KEY的值已經被其他客戶端更改,則使用EXEC執行事務時,事務佇列將不會被執行,同時返回Nullmulti-bulk應答以通知呼叫者事務執行失敗。

後續我將向大家分享更多程式設計開發相關的技術知識和工作日常的事情。

16
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 用Python生成PDF Locker GUI應用程式