Redisクラスター内のトランザクションは、Redisスタンドアロンを使用したトランザクションとは別の話です。
TL; DR;
これは、クライアントの問題というよりも、保証とトレードオフに関する概念的な問題です。
説明
Redisクラスターでは、特定のノードが1つ以上のハッシュスロットのマスターになります。これは、複数のノード間でデータをシャーディングするためのパーティション分割スキームです。コマンドで使用されるキーから計算された1つのハッシュスロットは、1つのノードに存在します。複数のキーを持つコマンドは、同じハッシュスロットに生成されるように制限されています。それ以外の場合は、拒否されます。このようなコンステレーションはクロススロットと呼ばれます。
トランザクションは、クロススロットキーへのコマンドを実行するためのソリューションのようですが、ある時点で、1つのノードのスコープを離れ、トランザクションを続行するために別のノードが必要になります。これは、一方のキーが1つのノードに存在し、もう一方のキーが別のノードに存在する場合に発生する可能性があります。トランザクションの調整はまだ行われておらず、Redisクラスターの問題になる場合があります。
Redis Clusterのトランザクションサポートを提供する高レベルAPIは複数の問題に直面しており、これまでのところ、RedisClusterでトランザクションを処理する方法という2つの戦略があります。
すべてのキーが1つのノードにある場合はトランザクションをサポートします
このオプションにより、フル機能のトランザクションが可能になります。クライアントライブラリは、トランザクションが実行されるノードを追跡し、トランザクションの進行中はスロット範囲外のキーを禁止する必要があります。スロットはキーを含むコマンドを使用することによってのみ決定できるため、クライアントはトランザクションフラグを設定する必要があり、キーを含む最初のコマンドで、トランザクション内の最初のコマンドの直前にMULTIコマンドを発行する必要があります。ここでの制限は、明らかに、すべてのキーを1つのノードに配置する必要があることです。
分散トランザクション
この場合、分散トランザクションに参加するすべてのノードで複数のトランザクションが開始されます。この分散トランザクションには、すべてのマスターノードからのキーを含めることができます。トランザクションが実行されると、クライアントライブラリがトランザクションの実行をトリガーし、ライブラリはすべての結果を収集して(コマンド結果の順序を維持するために)、呼び出し元に返します。
このスタイルのトランザクションは、クライアントに対して透過的です。特定のノードのキーが要求され、そのノードがまだトランザクションの一部ではない場合、MULTI
ノードをトランザクションに参加させるためにコマンドが発行されます。ここでの欠点は、トランザクションが条件付きでなくなることです(WATCH
)。個々のトランザクションは、キーが別のノードで変更されたかどうかを認識していないため、1つのトランザクションをロールバックして、他のトランザクションを成功させることができます。 2フェーズコミットのように聞こえます。
結論
Redis Transactionsは、条件付きで作成できるアトミックコマンドバッチ処理のように感じます。読み取り結果はコマンドの発行時ではなくトランザクションの実行時に返されるため、コマンドの実行は延期されることに注意してください。
Redis Clusterの場合、クライアントはグローバル戦略を決定していません。特定のRedisクラスターノードでトランザクションを実行するのは安全ですが、そのノードによって提供されるキーに制限されます。考えられる両方の戦略には、特定のユースケースに役立つ可能性があるプロパティがありますが、制限もあります。