トランザクションのロールバックが必要な場合は、Redis以外のものを使用することをお勧めします。 Redisトランザクションは、他のデータストアの場合と同じではありません。 Multi / Execでさえ、ロールバックがないため、希望どおりに機能しません。ロールバックが必要な場合は、復元できるように両方のリストをプルダウンする必要があります。エラー状態と「ロールバック」の間に、他のクライアントもどちらのリストも変更しないことを期待します。正気で信頼できる方法でこれを行うことは、簡単でも単純でもありません。また、SOは非常に広範であり、Redis固有ではないため、これはおそらく良い質問ではありません。
ここで、EXECが考えられることを実行しない理由について説明します。提案されたシナリオでは、MULTI/EXECのみ 次の場合を処理します:
- 他の変更が発生しないようにWATCHを設定しました
- EXECを発行する前にクライアントが停止します
- Redisのメモリが不足しています
EXECコマンドを発行した結果、エラーが発生する可能性があります。 EXECを発行すると、Redisはすべてを実行します キュー内のコマンドとエラーのリストを返します。 add-to-list-1が機能し、add-to-list-2が失敗する場合は提供されません。 2つのリストはまだ同期していません。 MULTIを発行した後にLPUSHを発行すると、常にOK
が返されます。 あなたがいない限り:
- a)以前に時計を追加し、そのリストに何かが変更されたか、
- b)Redisは、キューに入れられたプッシュコマンドに応答してOOM状態を返します
DISCARDは、一部の人が考えるようには機能しません。 DISCARDはの代わりに使用されます ロールバックメカニズムとしてではなく、EXEC。 EXECを発行すると、トランザクションが完了します。 Redisにはロールバックメカニズムがまったくありません。これは、Redisのトランザクションの目的ではありません。
Redisがトランザクションと呼ぶものを理解するための鍵は、それらが本質的にクライアント接続レベルのコマンドキューであることを理解することです。それらはデータベースステートマシンではありません。