Redis-10 Redisのトランザクションロールバック


文書ディレクトリ

  • 概要
  • シーン1:コマンドグリッドが正しい、データ型エラー
  • シーン2:コマンドフォーマットエラー
  • まとめ
  • 概要


    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がこのような簡単な事務を維持しているのは、モバイルインターネットの核心的な問題である性能を保証するためだ.