すべてのプロダクト
Search
ドキュメントセンター

Tair (Redis® OSS-Compatible):トランザクション処理

最終更新日:Jan 10, 2025

Tair (Redis OSS-compatible) は、Redisで定義されたトランザクションメカニズムをサポートしています。 MULTIEXECDISCARDWATCH、およびUNWATCHコマンドを実行して、トランザクションでアトミック操作を実行できます。

Redisのトランザクションは、リレーショナルデータベースのトランザクションとは異なります。 トランザクションの操作が失敗した場合、またはDISCARDコマンドによってトランザクションがキャンセルされた場合、Redisはトランザクションのロールバックを実行しません。

サンプルコード

例1: 2つのクライアントが異なるキーを処理する

サンプルコード:

packag e transcation.kvstore.aliyun.com;
java.util.Listをインポートします。redis.clients.jedis.Jedisをインポートします。redis.clients.jedis.Transactionをインポートします。パブリッククラスKVStoreTranscationTest {
    static final String host = "xxxxxx.m.cnhza.kvstore.aliyuncs.com";
    static final int port = 6379;
    static final String password = "password";
    // これら2つのキーの内容が異なることに注意してください。
    静的文字列client1_key = "KVStore-Transcation-1";
    静的文字列client2_key = "KVStore-Transcation-2";
    public static void main(String[] args) {
        Jedis jedis = new Jedis(host, port);
        // ApsaraDB for Redisインスタンスへの接続に使用されるパスワード。
        String authString = jedis.auth (パスワード);// password
        if (!authString.equals("OK")) {
            System.err.println("authentication failed: " + authString);
            jedis.close();
            return;
        }
        jedis.set(client1_key、"0");
        // 別のスレッドを起動して、他のクライアントをシミュレートします。
        新しいKVStoreTranscationTest().new OtherKVStoreClient().start();
        Thread.sleep(500);
        Transaction tx = jedis.multi();// トランザクションを開始します。
        // 次の操作は、アトミック操作としてサーバーに送信されます。
        tx.incr(client1_key);
        tx.incr(client1_key);
        Thread.sleep(400);// スレッドの中断は、トランザクションの後続の操作には影響しません。 その他のスレッド操作は実行できません。
        tx.incr(client1_key);
        Thread.sleep(300);// スレッドの中断は、トランザクションの後続の操作には影響しません。 その他のスレッド操作は実行できません。
        tx.incr(client1_key);
        Thread.sleep(200);// スレッドの中断は、トランザクションの後続の操作には影響しません。 その他のスレッド操作は実行できません。
        tx.incr(client1_key);
        List<Object> result = tx.exe c();// トランザクションを実行します。
        // 結果を解析して表示します。
        for (オブジェクトrt: 結果) {
            System.out.println("Client 1 > transaction in progress> " + rt.toString());
        }
        jedis.close();
    }
    クラスOtherKVStoreClient extends Thread {
        @Override
        public void run() {
            Jedis jedis = new Jedis(host, port);
            // ApsaraDB for Redisインスタンスへの接続に使用されるパスワード。
            String authString = jedis.auth (パスワード);// password
            if (!authString.equals("OK")) {
                System.err.println("AUTH Failed: " + authString);
                jedis.close();
                return;
            }
            jedis.set(client2_key、"100");
            for (int i = 0; i < 10; i++) {
                try {
                    Thread.sleep(300);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("クライアント2 > " + jedis.incr(client2_key));
            }
            jedis.close();
        }
    }
}

正しいエンドポイントとパスワードを入力してTair (Redis OSS-compatible) インスタンスに接続し、上記のJavaコードを実行すると、次の出力が表示されます。 出力は、クライアント1とクライアント2が2つの異なるスレッドで実行されることを示しています。 クライアント1によって提出されたトランザクション動作は、順次に実行される。 クライアント2は、この期間中に別のキーで操作を実行する要求を送信しますが、操作はブロックされます。 クライアント2は、クライアント1のすべてのトランザクション操作が完了するまで待たなければならない。

期待される出力:

クライアント2 > 101
クライアント2 > 102
クライアント2 > 103
クライアント2 > 104
クライアント1> 処理中> 1
クライアント1> transaction in progress> 2
クライアント1> transaction in progress> 3
クライアント1> transaction in progress> 4
クライアント1> transaction in progress> 5
クライアント2 > 105
クライアント2 > 106
クライアント2 > 107
クライアント2 > 108
クライアント2 > 109
クライアント2 > 110 

例2: 2つのクライアントが同じキーを処理する

例1のコードは、2つのクライアントが同じキーを処理するようにわずかに変更されています。 コードの他の部分は変更されません。

... ...
// これら2つのキーの内容は同じになりました。
    静的文字列client1_key = "KVStore-Transcation-1";
    静的文字列client2_key = "KVStore-Transcation-1";
    ... ...

修正されたJavaコードが実行されると、次の出力が表示されます。 2つのクライアントは異なるスレッドで実行されますが、同じキーを処理します。 しかしながら、クライアント1がこのキーを処理するためにトランザクション機構を使用する間、クライアント2はブロックされ、クライアント1の全てのトランザクション動作が完了するまで待たなければならない。

クライアント2 > 101
クライアント2 > 102
クライアント2 > 103
クライアント2 > 104
クライアント1> 進行中のトランザクション> 105
クライアント1> 進行中のトランザクション> 106
クライアント1> 進行中のトランザクション> 107
クライアント1> 進行中のトランザクション> 108
クライアント1> 進行中のトランザクション> 109
クライアント2 > 110
クライアント2 > 111
クライアント2 > 112
クライアント2 > 113
クライアント2 > 114
クライアント2 > 115