序文#
今日、Redis を学んでいると、Redis のトランザクション機能がロールバックできないことに気づきました。つまり、トランザクションを実行する際に途中で何かエラーが発生した場合、トランザクションを前の状態に戻すのではなく、そのまま続行されます。
何だって?それって、トランザクションって何のためにあるの?原子性も一貫性もないじゃん。
資料を調べたり考えたりして、少しまとめてみましたが、完全ではないかもしれません。
分離性#
ロールバックがサポートされていなくても、並行環境下での分離性があります。watch
を使用すると楽観的ロックのようなものが実現でき、最後の exec
時に競合をチェックします。
シンプルで効率的#
たくさんの Redis コマンドを学んできましたが、ほとんどのコマンドはエラーを返しません。たとえば、キーを間違えて入力した場合でも、単に nil
を返すだけです。Redis コマンドの構文エラーや誤ったタイプのキーを使用した場合にのみエラーが発生します。これらのエラーは開発時に発見されるべきです。
したがって、ロールバックがなくなったことで、Redis の内部はよりシンプルで効率的になり、パフォーマンスが向上します。
つまり、ロールバックのサポートは不要で、これにより Redis はよりシンプルで効率的になります。