1. 程式人生 > >Redis與MySQL中事務的區別

Redis與MySQL中事務的區別

1、mysql中只有使用了InnoDB引擎的資料庫或表才支援事務;
2、使用“事務”的目的是:統一管理insert,update,delete這些寫操作,以此來維護資料的完整性。

事務命令

mysql:

begin	  #顯式地開啟一個事務
commit	  #提交事務,對資料庫進行的所有寫操作變為永久性的
rollback  #結束使用者的事務,並撤銷正在進行的所有未提交的寫操作

redis支援簡單的事務:

multi		#標記事務的開始
exec		#執行事務的commands佇列
discard		#結束事務,並清除commands佇列

通過類比msyql來理解redis的事務命令,很顯然,它們有著本質區別。

redis和mysql事務的對比(不能回滾):

		  mysql		   				     redis
開啟	  start transaction/begin	     multi		
語句	  SQL						     命令	
失敗	  roolback回滾				     discart取消
成功	  commit提交					 exec執行事務的命令佇列	

roolbackdiscard的區別:
如果已經成功執行了2條語句,第3條語句出錯。roolback後前面2條語句的影響小時;discard只是結束本次事務,前面2條語句造成的影響仍然存在。

multi後面的語句出錯可能有兩種情況:


1、語法就有問題。(這種exec時報錯,所有語句都不執行)
2、語法本身沒有錯,但使用物件有問題。比如zadd命令操作link物件,exec之後回執行正確的語句並跳過不適當的語句。

思考:悲觀鎖和樂觀鎖

我正在買票:

ticket -1;
money -100;
#票減1,錢減100

而如果票只有1張,如果在multi之後exec之前,票被其他人買走了,即ticket變為0了。
我該如何觀察這種情況,並不在提交?

悲觀的想法:有人和我搶,給ticket加鎖,只有我能操作。(悲觀鎖)
樂觀的想法:我只需要注意有沒有人更改ticket的值就可以了。(樂觀鎖)

redis的事務中,啟動的是樂觀鎖,只負責監測key有沒有被改動

Redis Watch 命令

Redis Watch 命令用於監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那麼事務將被打斷

redis Watch 命令基本語法如下:

WATCH key [key ...]

還是結合上面買票業務來理解:

redis> watch ticket				#監視ticket這個key
OK
redis> multi					#開啟事務
OK
redis> decr tickert				#票減去1(注意我們這裡只有一張票)
QUEUED
redis> decrby monery 100
QUEUED
redis> exec
(nil)							#返回nil說明監視的tiket已經改變了,事務就取消了