Redis トランザクション

Redis トランザクションは一度に複数のコマンドを実行でき、以下の3つの重要な保証を備えています:

  • バッチ操作は、EXEC コマンドを送信する前にキューキャッシュに入れられます。
  • EXEC コマンドを受信するとトランザクションの実行に入ります。トランザクション内の任意のコマンドが実行に失敗しても、残りのコマンドは引き続き実行されます。
  • トランザクションの実行中に、他のクライアントが送信したコマンド要求がトランザクション実行のコマンドシーケンスに挿入されることはありません。

1つのトランザクションは、開始から実行までに次の3つの段階を経ます:

  • トランザクションを開始します。
  • コマンドをキューに入れます。
  • トランザクションを実行します。

例

以下はトランザクションの例です。まずMULTIでトランザクションを開始し、その後複数のコマンドをトランザクションにキューに入れ、最後にEXECコマンドでトランザクションをトリガーし、トランザクション内のすべてのコマンドをまとめて実行します:

redis 127.0.0.1:6379> MULTI
OK

redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUED

redis 127.0.0.1:6379> GET book-name
QUEUED

redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUED

redis 127.0.0.1:6379> SMEMBERS tag
QUEUED

redis 127.0.0.1:6379> EXEC
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"
   2) "C++"
   3) "Programming"

単一のRedisコマンドの実行はアトミックですが、Redisはトランザクションに原子性を維持するメカニズムを追加していないため、Redisトランザクションの実行はアトミックではありません。

トランザクションは、パッケージ化されたバッチ実行スクリプトと理解できます。ただし、バッチコマンドはアトミックな操作ではないため、途中のあるコマンドが失敗しても、それまでに実行されたコマンドがロールバックされることはなく、後続のコマンドが実行されなくなることもありません。

これは公式サイト上の説明です(From redis docs on より)。transactions:

It's important to note that even when a command fails, all the other commands in the queue are processed – Redis will not stop the processing of commands.

例えば:

redis 127.0.0.1:7000> multi
OK
redis 127.0.0.1:7000> set a aaa
QUEUED
redis 127.0.0.1:7000> set b bbb
QUEUED
redis 127.0.0.1:7000> set c ccc
QUEUED
redis 127.0.0.1:7000> exec
1) OK
2) OK
3) OK

set b bbb で失敗した場合、set a は既に成功しておりロールバックされず、set c は引き続き実行されます。


Redis トランザクションコマンド

以下の表に、redis トランザクションの関連コマンドを示します:

番号コマンドと説明
1DISCARD
トランザクションをキャンセルし、トランザクションブロック内のすべてのコマンドの実行を破棄します。
2EXEC
トランザクションブロック内のすべてのコマンドを実行します。
3MULTI
トランザクションブロックの開始をマークします。
4UNWATCH
WATCH コマンドによるすべてのキーへの監視をキャンセルします。
5WATCH key [key ...]
1つ(または複数)のキーを監視します。トランザクションの実行前にこの(またはこれらの)キーが他のコマンドによって変更された場合、トランザクションは中断されます。
その他の拡張