Redis-10 Redisのトランザクションロールバック
7039 ワード
文書ディレクトリ
概要
Redisでは、トランザクションの処理に注意するだけでなく、データベースとは異なるロールバック機能もあります.これは、次のように、Redisトランザクションが遭遇するコマンドフォーマットが正しく、データ型が一致しないという問題にも注意する必要があります.
シーン1:コマンドグリッドが正しい、データ型が間違っている 127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET key1 value1
QUEUED
127.0.0.1:6379> SET key2 value2
QUEUED
127.0.0.1:6379> INCR key1
QUEUED
127.0.0.1:6379> DEL key2
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) OK
3) (error) ERR value is not an integer or out of range
4) (integer) 1
127.0.0.1:6379> GET key1
"value1"
127.0.0.1:6379> GET key2
(nil)
127.0.0.1:6379>
key 1を文字列に設定し、コマンドincrを使用して自己増加しますが、コマンドはトランザクションキューにのみ入り、実行されません.したがって、エラーは発生せず、execコマンドの実行を待つことになります.
execコマンドが実行すると、直前にキューに入るコマンドが順次実行され、incrに遭遇するとコマンド操作のデータ型エラーが発生するため、エラーが表示され、その前後のコマンドが正常に実行する.
シーン2:コマンドフォーマットエラー
なお、ここではコマンドフォーマットが正しいが、問題はデータ型であり、コマンドフォーマットが間違っているのに次のような場合がある127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set key1 value1
QUEUED
127.0.0.1:6379> incr
(error) ERR wrong number of arguments for 'incr' command
127.0.0.1:6379> set key2 value2
QUEUED
127.0.0.1:6379> EXEC
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> GET key1
(nil)
127.0.0.1:6379> GET key2
(nil)
127.0.0.1:6379>
私たちが使用しているincrコマンドのフォーマットが間違っていることがわかります.このとき、Redisはすぐに検出され、エラーが発生します.その前にkeylを設定しました.その後、key 2 aを設定しました.トランザクションが実行されると、keylとkey 2の値が空になっていることがわかりました.Redisトランザクションにロールバックされたと言います.
まとめ
上記の2つの例では、Redisがトランザクションコマンドを実行するとき、コマンドがエンキューされるとトランザクションのコマンドが正しいかどうかを検出し、正しくないとエラーが発生することがわかります.前も後も命令は事務所に回され、なぜか実行されなかった.
データ構造の操作によるエラーのため、コマンドのフォーマットが正しい場合、コマンドの実行にエラーが発生し、その前と後のコマンドが正常に実行されます.この点はデータベースとは異なり、注意すべき点です.
いくつかの重要な操作については、Redisトランザクションの正確な実行を保証し、データの不一致を回避するために、プログラムを通じてデータの正確性を検出する必要があります.Redisがこのような簡単な事務を維持しているのは、モバイルインターネットの核心的な問題である性能を保証するためだ.
127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET key1 value1
QUEUED
127.0.0.1:6379> SET key2 value2
QUEUED
127.0.0.1:6379> INCR key1
QUEUED
127.0.0.1:6379> DEL key2
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) OK
3) (error) ERR value is not an integer or out of range
4) (integer) 1
127.0.0.1:6379> GET key1
"value1"
127.0.0.1:6379> GET key2
(nil)
127.0.0.1:6379>
key 1を文字列に設定し、コマンドincrを使用して自己増加しますが、コマンドはトランザクションキューにのみ入り、実行されません.したがって、エラーは発生せず、execコマンドの実行を待つことになります.
execコマンドが実行すると、直前にキューに入るコマンドが順次実行され、incrに遭遇するとコマンド操作のデータ型エラーが発生するため、エラーが表示され、その前後のコマンドが正常に実行する.
シーン2:コマンドフォーマットエラー
なお、ここではコマンドフォーマットが正しいが、問題はデータ型であり、コマンドフォーマットが間違っているのに次のような場合がある127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set key1 value1
QUEUED
127.0.0.1:6379> incr
(error) ERR wrong number of arguments for 'incr' command
127.0.0.1:6379> set key2 value2
QUEUED
127.0.0.1:6379> EXEC
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> GET key1
(nil)
127.0.0.1:6379> GET key2
(nil)
127.0.0.1:6379>
私たちが使用しているincrコマンドのフォーマットが間違っていることがわかります.このとき、Redisはすぐに検出され、エラーが発生します.その前にkeylを設定しました.その後、key 2 aを設定しました.トランザクションが実行されると、keylとkey 2の値が空になっていることがわかりました.Redisトランザクションにロールバックされたと言います.
まとめ
上記の2つの例では、Redisがトランザクションコマンドを実行するとき、コマンドがエンキューされるとトランザクションのコマンドが正しいかどうかを検出し、正しくないとエラーが発生することがわかります.前も後も命令は事務所に回され、なぜか実行されなかった.
データ構造の操作によるエラーのため、コマンドのフォーマットが正しい場合、コマンドの実行にエラーが発生し、その前と後のコマンドが正常に実行されます.この点はデータベースとは異なり、注意すべき点です.
いくつかの重要な操作については、Redisトランザクションの正確な実行を保証し、データの不一致を回避するために、プログラムを通じてデータの正確性を検出する必要があります.Redisがこのような簡単な事務を維持しているのは、モバイルインターネットの核心的な問題である性能を保証するためだ.
127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set key1 value1
QUEUED
127.0.0.1:6379> incr
(error) ERR wrong number of arguments for 'incr' command
127.0.0.1:6379> set key2 value2
QUEUED
127.0.0.1:6379> EXEC
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> GET key1
(nil)
127.0.0.1:6379> GET key2
(nil)
127.0.0.1:6379>
上記の2つの例では、Redisがトランザクションコマンドを実行するとき、コマンドがエンキューされるとトランザクションのコマンドが正しいかどうかを検出し、正しくないとエラーが発生することがわかります.前も後も命令は事務所に回され、なぜか実行されなかった.
データ構造の操作によるエラーのため、コマンドのフォーマットが正しい場合、コマンドの実行にエラーが発生し、その前と後のコマンドが正常に実行されます.この点はデータベースとは異なり、注意すべき点です.
いくつかの重要な操作については、Redisトランザクションの正確な実行を保証し、データの不一致を回避するために、プログラムを通じてデータの正確性を検出する必要があります.Redisがこのような簡単な事務を維持しているのは、モバイルインターネットの核心的な問題である性能を保証するためだ.