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