Redis 詳解事務

2021-10-06 02:55:05 字數 3423 閱讀 7916

什麼是事務?簡單點說事務就是一次批處理,給定指令碼一下性執行完畢

什麼是事務

可以一次執行多個命令,本質是一組命令的集合。乙個事務中的所有命令都會序列化,按順序地序列化執行而不會被其它命令插入,就像排隊一樣,不許加塞。 就是指排好隊,按序一次執行一大堆命令

作用乙個佇列中,一次性、順序性、排他性的執行一組命令

命令取消事務

discard
執行所有事務塊的命令

exec
開啟事務,標記乙個事務的開始

multi
取消watch命令對所有key的監視

unwatch
監視乙個或多個key,如果在事務執行之前這個key被其他命令修改,那麼事務將被打斷

watch key [key...

...]

特點

正常情況,multi正常開啟事務,然後輸入一條一條的set、get命令入隊,最後exec執行,輸出正確結果,

127.0

.0.1

:6379

> multi

ok127.0

.0.1

:6379

> set k1 v1

queued

127.0

.0.1

:6379

> set k2 v2

queued

127.0

.0.1

:6379

> get k1

queued

127.0

.0.1

:6379

> exec

1) ok

2) ok3)

"v1"

127.0

.0.1

:6379

>

放棄事務,在exec之前輸入discard,事務就會被放棄,事務的命令都不會執行

127.0

.0.1

:6379

> multi

ok127.0

.0.1

:6379

> set k1 v1

queued

127.0

.0.1

:6379

> set k2 v2

queued

127.0

.0.1

:6379

> discard

ok127.0

.0.1

:6379

>

全體連坐,要麼全部成功,要麼全部失敗,只要有乙個失敗,就全部不執行。限於在入隊時就報錯。

127.0

.0.1

:6379

> multi

ok127.0

.0.1

:6379

> set k1 v1

queued

127.0

.0.1

:6379

> set k2 v2

queued

127.0

.0.1

:6379

> setget k1 v1

(error) err unknown command 'setget'

127.0

.0.1

:6379

> exec

(error) execabort transaction discarded because of previous errors.

127.0

.0.1

:6379

>

冤頭債主,誰犯錯誰承擔,如果入隊沒有報錯,那麼在執行時,誰報錯誰失敗,不會影響別的命令

127.0

.0.1

:6379

> keys *1)

"k2"2)

"k1"

127.0

.0.1

:6379

> multi

ok127.0

.0.1

:6379

> incr k1

queued

127.0

.0.1

:6379

> set k3 v3

queued

127.0

.0.1

:6379

> exec1)

(error) err value is not an integer or out of range

2) ok

127.0

.0.1

:6379

> get k3

"v3"

127.0

.0.1

:6379

>

watch監控,類似於樂觀鎖,如果但是乙個key,那麼如果有另乙個客戶端修改監視的key之後,本客戶端再修改就會失敗,只能重新監視,然後執行

127.0

.0.1

:6379

> keys *1)

"dbt"2)

"balance"

127.0

.0.1

:6379

> get balance

"100"

127.0

.0.1

:6379

> watch balance

ok127.0

.0.1

:6379

> set balance 500

ok127.0

.0.1

:6379

> multi

ok127.0

.0.1

:6379

> decrby balance 10

queued

127.0

.0.1

:6379

> incrby dbt 10

queued

127.0

.0.1

:6379

> exec

(nil)

127.0

.0.1

:6379

>

悲觀鎖

悲觀地認為一定會有人改自己的資料,所以每次操作之前把整張表都鎖上

樂觀鎖行鎖,每次拿資料都認為別人不會修改,但是有乙個版本號

exec,discard,unwatch命令都會清除連線中的所有監視。

Redis 事務 詳解

redis 事務可以一次執行多個命令,並且帶有以下兩個重要的保證 1 事務是乙個單獨的隔離操作 事務中的所有命令都會序列化 按順序地執行。事務在執行的過程中,不會被其他客戶端傳送來的命令請求所打斷 2 事務是乙個原子操作 事務中的命令要麼全部被執行,要麼全部都不執行 乙個事務從開始到執行會經歷以下三...

mysql事務隔離級別詳解 事務的隔離級別詳解

事務的隔離級別 在資料庫操作中,為了有效保證併發讀取資料的正確性,提出的事務隔離級別。問題的提出 資料庫是要被廣大客戶所共享訪問的,那麼在資料庫操作過程中很可能出現以下幾種不確定情況。更新丟失 兩個事務都同時更新一行資料,乙個事務對資料的更新把另乙個事務對資料的更新覆蓋了。這是因為系統沒有執行任何的...

如何理解事務?

一件事從開始發生到結束的整個過程。在mysql裡事務是一組不可被分割執行的sql語句集合,如果有必要,可以撤銷。這樣可以確保資料的一致性。rollback事物回滾,則事物執行失敗,保證了資料安全。mysql中預設sql語句會自動commit到資料庫,在預設情況下mysql開啟的是autocommit...