English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Redisトランザクションは一度に複数のコマンドを実行し、以下の3つの重要な保証を持っています:
バッチ操作はEXECコマンドを送信する前にキューにキャッシュされます。
EXECコマンドを受け取った後、トランザクションの実行に移行します。トランザクション内の任意のコマンドが失敗しても、残りのコマンドは実行されます。
トランザクションの実行中に、他のクライアントが送信したコマンドリクエストは、トランザクションの実行コマンドシーケンスに挿入されません。
トランザクションは開始から実行まで以下の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 トランザクション:
コマンドが失敗しても、キュー内の他のコマンドは処理されます - Redisはコマンドの処理を停止しません。
例えば:
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トランザクションに関するコマンドが示されています:
番号 | コマンドおよび説明 |
---|---|
1 | DISCARD トランザクションをキャンセルし、トランザクションブロック内のすべてのコマンドの実行を中止します。 |
2 | EXEC トランザクションブロック内のすべてのコマンドを実行します。 |
3 | MULTI トランザクションブロックの開始をマークします。 |
4 | UNWATCH WATCH コマンドによるすべてのキーの監視を解除します。 |
5 | WATCH キー [キー ...] キーを監視する(または複数のキーを監視する)場合、このトランザクションが実行される前にこの(またはこれらの)キーが他のコマンドで変更された場合、トランザクションは中断されます。 |