Tair (Redis OSS-compatible) mendukung mekanisme transaksi yang didefinisikan di Redis. Anda dapat menggunakan perintah MULTI, EXEC, DISCARD, WATCH, dan UNWATCH untuk menjalankan operasi atomik dalam transaksi.
Transaksi di Redis berbeda dengan transaksi pada database relasional. Jika suatu operasi dalam transaksi gagal atau transaksi dibatalkan oleh perintah DISCARD, Redis tidak melakukan rollback transaksi.
Kode contoh
Contoh 1: Dua klien memproses kunci yang berbeda
Berikut adalah kode contoh:
package transcation.kvstore.aliyun.com;
import java.util.List;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;
public class KVStoreTranscationTest {
static final String host = "xxxxxx.m.cnhza.kvstore.aliyuncs.com";
static final int port = 6379;
static final String password = "password";
// Perhatikan bahwa kedua kunci ini memiliki konten yang berbeda.
static String client1_key = "KVStore-Transcation-1";
static String client2_key = "KVStore-Transcation-2";
public static void main(String[] args) {
Jedis jedis = new Jedis(host, port);
String authString = jedis.auth(password);//password
if (!authString.equals("OK")) {
System.err.println("otentikasi gagal: " + authString);
jedis.close();
return;
}
jedis.set(client1_key, "0");
// Mulai thread lain untuk mensimulasikan klien lainnya.
new KVStoreTranscationTest().new OtherKVStoreClient().start();
Thread.sleep(500);
Transaction tx = jedis.multi();// Mulai transaksi.
//Operasi berikut dikirim ke server sebagai operasi atomik:
tx.incr(client1_key);
tx.incr(client1_key);
Thread.sleep(400);// Penundaan thread tidak memengaruhi operasi selanjutnya dalam transaksi. Operasi thread lain tidak dapat dilakukan.
tx.incr(client1_key);
Thread.sleep(300);// Penundaan thread tidak memengaruhi operasi selanjutnya dalam transaksi. Operasi thread lain tidak dapat dilakukan.
tx.incr(client1_key);
Thread.sleep(200);// Penundaan thread tidak memengaruhi operasi selanjutnya dalam transaksi. Operasi thread lain tidak dapat dilakukan.
tx.incr(client1_key);
List<Object> result = tx.exec();// Eksekusi transaksi.
// Analisis dan tampilkan hasil.
for(Object rt : result){
System.out.println("Klien 1 > transaksi sedang berlangsung> "+rt.toString());
}
jedis.close();
}
class OtherKVStoreClient extends Thread{
@Override
public void run() {
Jedis jedis = new Jedis(host, port);
String authString = jedis.auth(password);// password
if (!authString.equals("OK")) {
System.err.println("AUTH Gagal: " + 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("Klien 2 > "+jedis.incr(client2_key));
}
jedis.close();
}
}
}Setelah Anda memasukkan endpoint dan kata sandi yang benar untuk terhubung ke instance Tair (Redis OSS-compatible) dan menjalankan kode Java sebelumnya, keluaran berikut akan ditampilkan. Keluaran menunjukkan bahwa klien 1 dan klien 2 berjalan di dua thread yang berbeda. Operasi transaksi dari klien 1 dieksekusi secara berurutan. Klien 2 mengirim permintaan untuk memproses kunci lain selama periode ini, tetapi operasi tersebut diblokir hingga semua operasi transaksi dari klien 1 selesai.
Keluaran yang diharapkan:
Klien 2 > 101
Klien 2 > 102
Klien 2 > 103
Klien 2 > 104
Klien 1> transaksi sedang berlangsung> 1
Klien 1> transaksi sedang berlangsung> 2
Klien 1> transaksi sedang berlangsung> 3
Klien 1> transaksi sedang berlangsung> 4
Klien 1> transaksi sedang berlangsung> 5
Klien 2 > 105
Klien 2 > 106
Klien 2 > 107
Klien 2 > 108
Klien 2 > 109
Klien 2 > 110Contoh 2: Dua klien memproses kunci yang sama
Kode pada Contoh 1 dimodifikasi sedikit agar dua klien memproses kunci yang sama. Bagian lain dari kode tetap tidak berubah.
... ...
// Perhatikan bahwa konten kedua kunci ini sekarang sama.
static String client1_key = "KVStore-Transcation-1";
static String client2_key = "KVStore-Transcation-1";
... ...Setelah kode Java yang dimodifikasi dijalankan, keluaran berikut ditampilkan. Kedua klien berjalan di thread yang berbeda tetapi memproses kunci yang sama. Namun, sementara klien 1 menggunakan mekanisme transaksi untuk memproses kunci ini, klien 2 diblokir dan harus menunggu hingga semua operasi transaksi dari klien 1 selesai.
Klien 2 > 101
Klien 2 > 102
Klien 2 > 103
Klien 2 > 104
Klien 1> transaksi sedang berlangsung> 105
Klien 1> transaksi sedang berlangsung> 106
Klien 1> transaksi sedang berlangsung> 107
Klien 1> transaksi sedang berlangsung> 108
Klien 1> transaksi sedang berlangsung> 109
Klien 2 > 110
Klien 2 > 111
Klien 2 > 112
Klien 2 > 113
Klien 2 > 114
Klien 2 > 115