1:実行MULTIコマンドマークトランザクションの開始
2:サーバは、クライアントからのコマンドを受信したときに、クライアントのトランザクション状態をキューに入れられたコマンドを入力すると、コマンドがすぐに実行されませんが、トランザクションキューにこれらのコマンドの全て、そしてQUEUEDに戻り、コマンドがキューイングされたことを示します。
各クライアントは、事務の自身の状態を持っているのRedis、トランザクションはトランザクションキューの状態を含み、カウンタは、チームの指揮を持っています。
typedefは構造体マルチステート{
//トランザクションキュー、FIFO順(配列)
multiCmd *コマンド。
//キューに入れられたコマンド数
int型のカウント;
}多重状態;
トランザクションキューが配列され、各配列項目は3つのプロパティがあり含まれています:
typdef構造体multiCmd {
//コマンドパラメータ
robj ** ARGV。
//パラメータの数
int型のargc;
//ポインタコマンド
構造体redisCommand * cmdを。
} multiCmd。
3:EXECコマンドは先入れ先出し(FIFO)方式トラバーサルクライアントトランザクション実行コマンドキューに、実行されます。実行後、EXECコマンド・キューがクライアントに返信させていただきます、クライアントのコマンドカウンタは、チームにクリアされ、リリーストランザクションキュー、非トランザクション状態に戻ります。
4:DISCARDコマンドはトランザクションをキャンセルするために使用され、それがクライアントのトランザクション全体のキューをクリアされ、その後、クライアントは、非トランザクション国政からの状態に戻って調整し、取引がキャンセルされたことを示す、クライアントに文字列OKを返します。
5:WATCHコマンドは、スタートボタンの前に問題の任意の数を監視するために使用されています。監視対象のキーのいずれかが別のクライアントが変更された場合は、EXECコマンドを呼び出すときには、トランザクションを実行した場合、トランザクション全体はもはや実行、ダイレクトリターン故障ではありません。事務の状態ではWATCHコマンドは、エラーが発生します送って、それは、トランザクション全体が失敗したことはありません、それは既存のデータのトランザクション・キューを変更しません。
達成するWATCHコマンド
redis.h / redisDb構造型データベース、watched_keysは、そのキーこのデータベースへの鍵となる辞書に保持されている監視され、辞書の値がリストされ、リストはすべて、このキーのクライアントの監視を保持しています。WATCHコマンドの役割は、現在のクライアントであり、watched_keysでキー仲間を監視するために、
WATCHトリガー
クライアントがトランザクションの実行をトリガ、EXECコマンドを送信すると、クライアント・サーバのステータスがチェックされます。
1 ::クライアントのREDIS_DIRTY_CASのオプションは、少なくとも一つのクライアントキーが変更された監視されていること、その後、開かれている場合は、安全保障は、破壊されています。サーバーはクライアントの戻りに直接空の返信を、このトランザクションの実装をあきらめるだろう、トランザクションが失敗したことを示しています。
2:REDIS_DIRTY_CASオプションが開いていない場合は、モニターのすべてのキーが固定されていることを、サーバーの正式な執行部
事務警告をRedisの:
1:エンキューコマンド構文エラー、EXECコマンドは、この時点で実行されていません
トランザクションでのexecコマンドコマンドの前に会ったのRedisが実行されることはありませんが、しかし、このようなパラメータの数が正しくありませんようにいくつかの明白な構文エラーを有することが判明したときに、それがになり、各コマンドをチェックすることが適切であろうチームはエラーメッセージを返すとき、あなたは廃棄命令ロールバックを呼び出すためのexecコマンドを参照してくださいするとき
2:Execが終了したら、他のコマンドの実行中に、エラーが発生しまし
コマンドの実装ではRedisのときに何かがうまくいかない場合は、その後、他のコマンドの実行を終了していないのRedis。それは限り、正しいコマンドとして、または後に、成功した両方の前とコマンドエラー実行されます、です
3:トランザクション間の相互作用
2つのトランザクションが同時にレコードを変更し、デフォルトでトランザクションがプロセスを行っていませんでしたRedisの場合は、execのトランザクションのすべての結果の最初は上書きされます。ここでは、キーが他のトランザクションによって変更された場合、ある特定のキーを監視するために使用された時計のコマンドを使用することができ、それは、トランザクションを修正するために、この時間は成功しませんし、その後プロンプト失敗に戻ります