English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Redis トランザクション

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 トランザクションコマンド

以下のテーブルには、redisトランザクションに関するコマンドが示されています:

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