Redis的基礎事務與ABA問題

2021-10-05 13:53:28 字數 1734 閱讀 7872

命令

說明備註

multi使用該命令開啟事務

該命令後的操作指令會進入佇列,並不會直接開始執行

watch key1 [key2……]監聽某些鍵

當被監聽的鍵的事務執行前被修改,則事務發生回滾。使用樂觀鎖

unwatch key1 [key2……]取消監聽某些鍵

exec執行事務命令

如果被監聽的鍵沒有被修改,就執行事務,否則發生回滾

discard回滾事務命令

回滾進入佇列的事務命令,之後就不能再用exec命令提交了

2.1,沒有新增監聽的基本事務的執行流程

2.1.1 控制台的執行效果

2.1.2 **實現簡單事務流程

public static void main(string args) 

};string value = (string) redistemplate.execute(sessioncallback);

system.out.println(value);

}

2.2,新增監聽的事務的執行流程

2.2.1 執行流程圖

2.2.2 新增監視的控制台實現

3.1 redis參考了多執行緒中的cas

redis的事務操作參考了多執行緒中的cas(比較與交換,compare and swap)去執行,這是一種樂觀鎖。

如:某些資料可能被多個業務所共享,當執行緒t1去執行業務邏輯時,其他共享的執行緒操作改資料,就可能導致多執行緒中資料的不一致情況。為了解決這一問題,執行緒在讀取共享資料前,會對共享資料加上監視,儲存到執行緒的副本中,這就是舊值。而在redis中使用了watch指令去實現這一功能,當事務執行時,去對比舊值,如果不一致就回滾。但是這種操作cas在多執行緒中可能出現aba問題

3.2 什麼是aba問題

時間執行緒1

執行緒2操作

t1x=a

-執行緒1加入監控x,此時共享資料x的值為a

t2執行複雜業務邏輯

修改x=b

執行緒2修改x為b

t3執行複雜業務邏輯

執行業務邏輯

執行緒二執行本身的簡單業務邏輯

t4執行複雜業務邏輯

修改x=a

執行緒2修改x為a

t5執行複雜業務邏輯

執行緒2退出

此時x仍然為a

t6與舊值進行比較x=a,舊值未改變

-cas原理檢查通過,舊值未發生變化

當執行到t6的時候,在t2—t5的時刻,執行緒2對於x的修改可能已經導致了執行緒1的業務運算發生了錯誤。但是cas原理對於舊值的檢查顯示舊值未發生改變,因此仍然視作正確的。這就是cas導致的aba問題。

在redis的機制中不會出現aba的問題

自己看到了兩個答案,

Redis事務與MySQL事務的區別

1.想著 在springboot事務中,第一步insert mysql 第二步 更新到redis中 transactional rollbackfor public void addchannel meschannelvo meschannelvo 3.測試事務回滾 int i null int i...

Redis的事務與鎖

一.redis事務 redis的事務和傳統關聯式資料庫的事務並不相同。在關聯式資料庫中,使用者首先向資料庫伺服器傳送begin,然後執行各個相互一致的寫操作和讀操作,最後,使用者可以選擇傳送commit來確認之前所做的修改,或者傳送rollback來放棄那些修改。在redis裡面也有簡單的方法可以處...

Redis基礎學習(五) Redis中的事務

redis的單條命令保證原子性,事務不保證原子性!事物的本質 一組命令的集合,乙個事務中所有的命令都會被序列化,在事務執行的過程中,會按照順序進行執行!事務的特性 一次性 單次 順序性 有順序 排他性 排除干擾 redis的事務沒有隔離級別的概念!所有的命令都在事務中,並沒有被立刻執行,只有在發起執...