Redis中的事務以及在Redis中使用樂觀鎖

2021-10-20 19:35:19 字數 2152 閱讀 1405

原子性:指事務是乙個不可再分的工作單位,事務中的操作要麼都發生,要麼都不發生,就好比a賬戶給b賬戶轉錢,這個事務有兩個操作,第乙個是a賬戶減去錢,第二個是b賬戶增加錢,原子性就是說這兩個操作要麼同時都發生,要麼都不發生,不可能乙個發生乙個不發生;

一致性:指事務發生前後,資料庫中的總資料是不能發生變化的,仍舉乙個例子,a賬戶給b賬戶轉錢,假設轉錢之前a,b賬戶錢數的總和是2000元,那麼轉錢之後,a,b賬戶錢數的總和也要是2000元;

隔離性:指乙個事務的執行不影響另乙個事務的執行,比如甲,乙兩個事務都操作同乙個共享資料,甲事務和乙事務對共享資料的操作互相不影響,因為甲,乙事務都各自有儲存自己資料的空間!

永續性:指事務被提交之後,資料庫中的資料就會發生改變並持久的儲存在資料庫中,不會發生回滾;

redis事務的基本概念:可以一次性把很多redis單條命令放到乙個集合佇列中,然後在執行exec命令之前,這些被新增到佇列中的命令並不會被執行,執行完exec命令之後,所有的命令,一次性,順序性,排他性的全部執行。

redis事務不像之前的關係型資料庫,之前的mysql中的關係型資料庫是有原子性的,但是redis事務沒有原子性,執行exec命令之後,即便佇列中的一條redis命令執行失敗,佇列中的其它redis單條命令仍會執行,而且redis事務是不會回滾的。

redis事務也沒有隔離性,因為在執行完multi命令之後,往佇列中新增redis單條命令的時候,這些單條命令並不會執行,不像之前學習mysql的關係型資料庫,事務中每條sql語句都是會執行的,所以在redis事務中不存在事務裡面可以檢視到更新的共享資料,而事務外面卻不可以檢視更新的共享資料,因為redis事務中的所有redis單條資料根本沒有執行,事務裡面和事務外面的單條資料都是相同的。

redis的單條命令是有原子性的,但是redis事務是沒有原子性的!

開啟事務(multi,此命令執行之後,之後寫的所有的redis單條命令都不會執行而是會存放到乙個佇列裡面)

命令入隊(此階段寫的所有的redis單條命令都不會被執行而是直接被放到佇列裡面)

執行事務(exec,此命令執行之後,佇列中的所有的redis單條命令會一次性,順序性,排他性的全部執行)

測試如下圖:

測試如下圖:

編譯性異常(**有問題!如命令拼寫錯誤!):redis事務中只有有乙個redis單體命令出現編譯性異常,那麼這個事務中所有的redis單體命令都不會被執行;

執行時異常(**沒有問題!但是邏輯有問題,如1/0在執行時就會報錯):redis事務中乙個單體命令的執行異常不會影響其它的redis單體命令。其它的單體命令仍會執行;

如下圖:

redis中使用樂觀鎖,會先在事務開始之前,也即是執行multi命令之前,使用watch命令監視特定的字段;假設watch監視的是a_money欄位,在事務開始之前,a_money的值是100,然後watch監視的a_money值就是100,如果在事務執行的時候即執行exec命令的時候a_money欄位的值仍是100,表示此事務執行期間沒有其他事務插隊執行,那麼此事務這時可以正常執行;但是如果在事務執行的時候即執行exec命令的時候,發現a_money欄位的值是1000,那麼就表示在此事務執行之前,已經有其它的執行緒插隊執行了,並且已經更改了資料,所以這個時候在執行exec命令此事務就不會執行了,這與之前我們在mybatisplus中所講的樂觀鎖的version欄位道理是一樣的。

具體的測試情況如下圖:

unwatch命令可以取消watch對所有key的監控,如下圖:

redis在php中,在PHP中使用redis

這裡是在mac os上安裝redis,並在php中開啟redis。在mac os上安裝redis 首先是安裝,它會預設安裝到 usr local bin下 複製 如下 cd tmp wget tar zxf redis 2.6.9.tar.gz cd redis 2.6.9 make sudo ma...

事務在Hibernate以及JPA中的應用 二

終於考完試了,接著總結事務在jpa中的應用。jpa中的事務可以採用以下兩種方式 1 resource local 如果採用此種型別的事務,那麼此時其實採用的就是本身資源的事務,比如如果資源是資料庫,那麼事務就是jdbc事務。在此種模式下,我們需要採用jpa介面entitytransaction介面來...

Redis中的事務

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