2016-09-20 23 views
0

私のプログラムは、Redisの2つのリストにトランザクションとしてデータを追加する必要があります。データは両方のリストで一貫している必要があります。例外またはシステム障害が発生し、1つのリストに追加されたデータのみをプログラムする場合、システムはリカバリおよびロールバックできる必要があります。しかし、Redisの文書によれば、ロールバックをサポートしていません。これをどのように実装できますか?私が使用する言語はJavaです。Redisでロールバックを使用してトランザクションを実装する方法

答えて

0

Redisの取引が異なります。それは2つのことを保証します。

  1. すべてまたはコマンドのいずれも
  2. シーケンシャルおよび中断のないコマンドを実行している

はあなたのコードを管理していると、システム障害が(いくつかの並べ替えが起こるだろうというとき知っていれば、と述べました例外をキャッチする)、この方法で要件を達成することができます。

  1. MULTI - >
  2. LPUSH QUEUE1 1は、トランザクションを開始 - >キューにプッシュ2
  3. EXEC /第4回では

を捨てる - >キューに1

  • LPUSHキュー2 1を押しますエラーがない場合はEXECを実行し、エラーまたは例外が発生した場合はロールバックしてDISCARDを実行します。

    希望します。

  • 2

    トランザクションのロールバックが必要な場合は、Redis以外のものを使用することをお勧めします。 Redisトランザクションは他のデータストアと同じではありません。たとえロールバックがないからでも、Multi/Execでさえ、あなたが望むものに対しては機能しません。ロールバックが必要な場合は、両方のリストをプルダウンしてリストアする必要があります。また、エラー状態とロールバックの間に、他のクライアントもリストのいずれかを変更しないようにしてください。これを日常的かつ信頼できる方法で行うのは簡単ではなく、単純でもありません。非常に広範で、Redis特有のものではないので、おそらくそれは良い質問ではないでしょう。

    ここで、EXECが考えていることをしない理由について説明します。あなたの提案シナリオMULTI/EXECでのみはの例ハンドル:あなたは、他の変更はあなたのクライアントは、EXECを発行する前に死ぬ

  • が起こっていないことを確認するための時計を設定

    1. のRedisはメモリ
    2. の外にあります

    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がトランザクションと呼ぶものを理解するための鍵は、基本的にクライアント接続レベルでのコマンドキューであることを理解することです。それらはデータベース状態マシンではありません。

  • 関連する問題