127.0.0.1:6379> multi OK 127.0.0.1:6379> set t1 v1 QUEUED 127.0.0.1:6379> set t2 v2 QUEUED 127.0.0.1:6379> setget t3 (error) ERR unknown command 'setget' 127.0.0.1:6379> set t4 v4 QUEUED 127.0.0.1:6379> exec (error) EXECABORT Transaction discarded because of previous errors. 127.0.0.1:6379> get t4 (nil)説明: exec コマンドを実行する前に、構文エラーが発生した場合 (存在しないコマンドが使用された場合)、コマンドがキューに入れられると、Redis はエラーを報告し、そのエラーを記録します。Exec コマンドが実行されると、Redi は送信されたすべてのコマンドを拒否し、トランザクションの実行は失敗します。この場合、Reid のトランザクションはアトミック性をサポートできます。 ケース 2 の説明例
127.0.0.1:6379> multi OK 127.0.0.1:6379> incr s2 QUEUED 127.0.0.1:6379> set a1 v1 QUEUED 127.0.0.1:6379> set a2 v2 QUEUED 127.0.0.1:6379> exec 1) (error) ERR value is not an integer or out of range 2) OK 3) OK 127.0.0.1:6379> get a2 "v2"説明: s2 の値は v2 であり、incr コマンドを実行するとエラーが報告されます。これは、incr は整数型の値しか追加できないためですが、この例では私たちが発見したケース Redis トランザクションはロールバックされず、後続のコマンドは正常に実行できるため、このケースではトランザクションのアトミック性は保証できません。 Redis トランザクションは一貫性をサポートしていますか? シナリオ 1: コマンドがキューに追加されるときにエラーが報告される最初のケースでは、トランザクション自体が破棄されるため、トランザクションの一貫性が保証されます。 ケース 2: コマンドがキューに追加されたときにエラーは報告されませんが、実際に実行されるときにエラーが報告されます。2 番目のケースでは、誤ったコマンドは実行されません。ただし、正しいコマンドは正常に実行でき、コマンドの実行時にエラーは報告されません。データベースの一貫性が変化します。 シナリオ 3: Redis インスタンスの実行コマンドの実行が失敗する
127.0.0.1:6379> get blance "100" 127.0.0.1:6379> watch blance OK 127.0.0.1:6379> multi OK 127.0.0.1:6379> decrby blance 10 QUEUED 127.0.0.1:6379> incrby blance 10 QUEUED 127.0.0.1:6379> exec (nil)クライアント 2:
127.0.0.1:6379> get blance "100" 127.0.0.1:6379> set blance 90 OK 127.0.0.1:6379> get blance "90"説明: クライアント 1 は、監視を使用して残高を検出し、トランザクションを開いた後、実行します。クライアント 2 で残高の値を変更する操作を実行し、トランザクション実行中にウォッチによって監視されるデータを変更する他のクライアントをシミュレートしてから、クライアント 1 の EXEC コマンドを実行すると、トランザクションが正常に実行されなかったことを確認します。
Redis トランザクションは永続性をサポートできません。Redis が RDB モードを使用している場合、トランザクションの実行後、次の RDB スナップショットが実行される前に、Redis インスタンスがクラッシュします。この場合、トランザクションの変更されたデータが維持されることは保証できません。 Redis が AOF モードを採用している場合、永続化設定が no、everysec、always のいずれであってもデータ損失が発生する可能性があるため、Redis がどの永続化モードを採用してもトランザクションの耐久性に影響を与えるため、サポートできません。
以上がRedis トランザクションを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。