WATCH
の理由 直接公開されないのは、SE.Redisが単一の接続で異なるコールスタックからのコマンドを多重化するように設計されているためです。これにより、トランザクション作業は非常に必要になります。 厳重に管理されています。
「変更されていない」の目的がそれ自体であるかどうかはよくわかりません。 、いくつかの既知の値と比較せずに-そうでなければ、競合状態を作成しているだけです。それに対するサポートを追加することは間違いなく可能ですが、私は最初に予想されるユースケースを本当に理解したいと思います。説明してもらえますか?
編集をやり直してください。好みの例(最後の例)は、redisでは不可能です -SE.Redisとは何の関係もありません。 GET
を実行した場合 MULTI
内 、EXEC
まで答えは得られません 完了-したがって、SET
の値を使用できない可能性があります :まだ利用できません 。
多重化が目的でない場合は、2番目の例を(SE.Redisの機能に基づいて)少し並べ替えることができます:
WATCH key
val = GET key
MULTI
val = val + 1
SET key $val
EXEC
これは典型的な WATCH
の使用 :あなたは見る 事前にクエリしていることを確認すると、{key}
このループの間は変更されません(または、少なくとも、トランザクションは中止されます。一貫性のない状態はありません)。ただし、WATCH
マルチプレクサではうまく機能しません 、これがSE.Redisがトランザクションの前に値をフェッチするルートを強制する理由です。 、次に値を比較して、変更されていないことを表明できます。同じ結果。アプローチは少し異なりますが、マルチプレクサに対して安全です。このトピックの詳細については、こちらをご覧ください。