Redis入門事務(楽観錠)
文書ディレクトリ
Redisベース
取引
Redisトランザクションの本質:コマンドのセット!1つのトランザクションのすべてのコマンドがシーケンス化され、トランザクションの実行中に順番に実行されます.
使い捨て、順序性、排他的な実行コマンド!
Redisのトランザクションに独立性レベルの概念がなければ、汚れた読み取り、幻の読み取りは起こり得ません.すべてのコマンドはトランザクションで直接実行されるのではなく、実行コマンドが開始されたときに一緒に実行されます.
Redisの単一コマンドは原子性を維持しますが、トランザクションは原子性を保証しません!
Redisのトランザクション:3ステップ!
multi
exec
トランザクションの正常な実行
127.0.0.1:6379> multi #
OK
#
127.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> set k3 v3
QUEUED
127.0.0.1:6379> exec #
1) OK
2) OK
3) "v1"
4) OK
トランザクションの破棄
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> discard #
OK
127.0.0.1:6379> get k4 #
(nil)
コンパイル型例外(Javaではコードエラー、Redisではコマンドエラー)は、トランザクション内のすべてのコマンドが実行されません。
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> sets k2 v2 #
(error) ERR unknown command `sets`, with args beginning with: `k2`, `v2`,
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> exec #
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get k3 #
(nil)
実行時異常(1/0などの構文エラー)は、トランザクションを実行するときに他のコマンドが正常に実行されます。エラーコマンド異常放出{{えらーこまんど:れいがいほうしゅつ}}
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 k2
QUEUED
127.0.0.1:6379> incr k1 # ,
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> get k2
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) ERR value is not an integer or out of range #
3) OK
4) "v2"
127.0.0.1:6379> get k2 # !
"v2"
127.0.0.1:6379> get k1
"k2"
楽観ロック
その名の通り:楽観的で、いつでも間違いがないと思っているので、鍵をかけません!
鍵をかけていないので、もし誰かがデータを変更したらどうしますか?更新するときは、その間にこのデータを修正してくれる人がいるかどうかを判断してみましょう.
Redis監視テスト!watch
127.0.0.1:6379> set money 100 # 100
OK
127.0.0.1:6379> set out 0 # 0
OK
127.0.0.1:6379> watch money #
OK
127.0.0.1:6379> multi #
OK
127.0.0.1:6379> decrby money 30 #
QUEUED
127.0.0.1:6379> incrby out 30 # 30,
QUEUED
127.0.0.1:6379> exec #
1) (integer) 70
2) (integer) 30
# ,
127.0.0.1:6379> watch money #
OK
127.0.0.1:6379> multi #
OK
127.0.0.1:6379> decrby money 20 # 20
QUEUED
127.0.0.1:6379> incrby out 20 # 20
QUEUED
# , ( ) , 100 , , !
127.0.0.1:6379> get money # 70
"70"
127.0.0.1:6379> incrby money 100 # 100
(integer) 170
# , ( )
127.0.0.1:6379> exec #
(nil)
では、どうやってこの問題を解決しますか.あなたはまだ買い物をしたいと思っていますか.お金が使えないことに気づくと硬くなる
# , , , ,
127.0.0.1:6379> UNWATCH # ,
OK
127.0.0.1:6379> watch money #
OK
127.0.0.1:6379> multi #
OK
127.0.0.1:6379> decrby money 20 #
QUEUED
127.0.0.1:6379> incrby out 20 #
QUEUED
127.0.0.1:6379> exec # , , , !
1) (integer) 150
2) (integer) 50
楽観的なロックは秒殺シーンに使えます!