All Products
Search
Document Center

Tablestore:Gunakan transaksi lokal

Last Updated:Aug 06, 2026

Tablestore SDK untuk Java mendukung transaksi lokal pada nilai kunci partisi tertentu, sehingga semua operasi tulis dalam transaksi tersebut dikomit secara keseluruhan atau dibatalkan seluruhnya. Tingkat isolasinya adalah Read Committed.

Prasyarat

  • Instal Tablestore SDK untuk Java dan inisialisasi klien.

  • Aktifkan transaksi lokal pada tabel. Anda dapat mengaktifkan fitur ini saat membuat tabel. Untuk mengaktifkan transaksi lokal pada tabel yang sudah ada atau memeriksa apakah fitur tersebut telah diaktifkan, kirimkan tiket.

Deskripsi

Transaksi lokal dibatasi pada satu nilai kunci partisi. Operasi baca dan tulis dalam transaksi dihubungkan melalui ID transaksi dan diterapkan secara atomik saat dikomit, dengan tingkat isolasi Read Committed. Transaksi lokal mencakup tiga tahap berikut:

  1. startLocalTransaction memulai transaksi dan mengembalikan ID transaksi.

  2. Setiap operasi baca atau tulis berikutnya menyambungkan ID tersebut dengan setTransactionId(txnId).

  3. commitTransaction mengkomit transaksi; abortTransaction membatalkannya.

Operasi yang didukung dalam transaksi adalah GetRow, PutRow, UpdateRow, DeleteRow, BatchWriteRow, dan GetRange.

public StartLocalTransactionResponse startLocalTransaction(StartLocalTransactionRequest request) throws TableStoreException, ClientException
public CommitTransactionResponse commitTransaction(CommitTransactionRequest request) throws TableStoreException, ClientException
public AbortTransactionResponse abortTransaction(AbortTransactionRequest request) throws TableStoreException, ClientException

public void setTransactionId(String transactionId)

Contoh berikut memulai transaksi lokal pada nilai kunci partisi pkvalue, menulis satu baris dengan kunci primer (pkvalue, 10001), lalu mengkomit transaksi tersebut.

String tableName = "local_tx_demo";

// 1. Mulai transaksi lokal untuk nilai kunci partisi yang ditentukan dan peroleh ID transaksi.
PrimaryKeyBuilder pkBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pkBuilder.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString("pkvalue"));
PrimaryKey partitionKey = pkBuilder.build();

StartLocalTransactionRequest startRequest =
        new StartLocalTransactionRequest(tableName, partitionKey);
String txnId = client.startLocalTransaction(startRequest).getTransactionID();

// 2. Tulis satu baris dalam transaksi. Anda harus menentukan kunci primer lengkap dan menyertakan ID transaksi.
PrimaryKeyBuilder rowKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
rowKeyBuilder.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString("pkvalue"));
rowKeyBuilder.addPrimaryKeyColumn("pk2", PrimaryKeyValue.fromLong(10001));
PrimaryKey rowKey = rowKeyBuilder.build();

RowPutChange rowPutChange = new RowPutChange(tableName, rowKey);
rowPutChange.addColumn(new Column("col1", ColumnValue.fromString("colvalue")));
rowPutChange.addColumn(new Column("col2", ColumnValue.fromLong(10)));

PutRowRequest putRequest = new PutRowRequest(rowPutChange);
putRequest.setTransactionId(txnId);
client.putRow(putRequest);

// 3. Komit transaksi agar semua operasi tulis diterapkan. Untuk membuang perubahan, panggil abortTransaction() sebagai gantinya.
CommitTransactionRequest commitRequest = new CommitTransactionRequest(txnId);
client.commitTransaction(commitRequest);

Parameter

Permintaan memulai transaksi

StartLocalTransactionRequest berisi parameter berikut.

Nama

Tipe

Deskripsi

tableName (wajib)

String

Nama tabel data.

primaryKey (wajib)

PrimaryKey

Nilai kunci partisi yang menentukan cakupan transaksi. Saat memulai transaksi lokal, tentukan hanya kolom kunci primer pertama dari tabel.

rowKeys (opsional)

List<PrimaryKey>

Kunci primer dari baris-baris yang akan dikunci saat transaksi dimulai. Panggil setRowKeys() untuk mengatur daftar atau addRowKey() untuk menambahkan satu kunci.

Permintaan dalam transaksi

Permintaan baca dan tulis data yang digunakan dalam transaksi mewarisi TxnRequest, yang berisi parameter berikut.

Nama

Tipe

Deskripsi

transactionId (wajib)

String

ID transaksi lokal yang dikembalikan oleh startLocalTransaction(). Setiap permintaan baca atau tulis dalam transaksi harus menyertakan ID ini dengan memanggil setTransactionId().

Terapkan atau batalkan permintaan

CommitTransactionRequest dan AbortTransactionRequest berisi parameter berikut.

Nama

Type

Deskripsi

transactionID (wajib)

String

ID transaksi lokal yang akan dikomit atau dibatalkan. Tentukan ID ini saat membuat permintaan.

Tanggapan

Hasil memulai transaksi

StartLocalTransactionResponse berisi bidang spesifik operasi berikut.

Nama

Tipe

Deskripsi

transactionID

String

ID transaksi lokal baru. Panggil getTransactionID() untuk memperoleh nilainya dan gunakan dalam operasi data transaksional berikutnya serta permintaan komit atau batalkan.

Batasan

  • Transaksi lokal tidak kompatibel dengan kolom kunci utama auto-increment.

  • Transaksi lokal menggunakan kunci pesimistis untuk kontrol konkurensi. Selama transaksi berlangsung, kunci tulis dipertahankan pada nilai kunci partisi, sehingga hanya permintaan tulis yang menyertakan ID transaksi yang berhasil.

  • Transaksi memiliki masa aktif maksimum 60 detik. Jika dua operasi berturut-turut terpisah lebih dari 60 detik, transaksi habis waktu dan server membuangnya.

  • Hanya satu permintaan yang dapat menggunakan ID transaksi dalam satu waktu. Operasi konkuren yang menggunakan ID yang sama semuanya gagal.

  • Setiap permintaan tulis dalam transaksi harus menggunakan nilai kunci partisi yang sama dengan yang digunakan saat memulai transaksi. Permintaan baca tidak memiliki batasan ini.

  • Satu transaksi dapat menulis hingga 4 MB data.

  • Jika operasi tulis dalam transaksi tidak menentukan versi kolom (timestamp), server menghasilkan timestamp pada saat penulisan, bukan pada saat komit. Aturan ini sama dengan aturan untuk operasi tulis biasa.

  • Saat permintaan BatchWriteRow menyertakan ID transaksi, semua baris harus menargetkan tabel tempat transaksi dimulai.

  • Jika transaksi tidak berisi operasi tulis, komit dan batalkan memiliki efek yang sama.

  • Permintaan baca atau tulis yang gagal namun menyertakan ID transaksi tidak mengakhiri transaksi. Anda dapat menerapkan kebijakan pengulangan atau secara eksplisit membatalkan transaksi.

Contoh

Baca satu baris di dalam transaksi

Buat transaksi read-only untuk nilai kunci partisi tertentu dan baca satu baris.

String tableName = "local_tx_demo";

// 1. Mulai transaksi lokal untuk nilai kunci partisi yang ditentukan.
PrimaryKeyBuilder pkBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pkBuilder.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString("pkvalue"));
PrimaryKey partitionKey = pkBuilder.build();

StartLocalTransactionRequest startRequest =
        new StartLocalTransactionRequest(tableName, partitionKey);
String txnId = client.startLocalTransaction(startRequest).getTransactionID();

// 2. Baca satu baris dalam transaksi. Anda harus menentukan kunci primer lengkap dan menyertakan ID transaksi.
PrimaryKeyBuilder rowKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
rowKeyBuilder.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString("pkvalue"));
rowKeyBuilder.addPrimaryKeyColumn("pk2", PrimaryKeyValue.fromLong(10001));
PrimaryKey rowKey = rowKeyBuilder.build();

SingleRowQueryCriteria criteria = new SingleRowQueryCriteria(tableName, rowKey);
criteria.setMaxVersions(1);

GetRowRequest getRequest = new GetRowRequest(criteria);
getRequest.setTransactionId(txnId);
GetRowResponse getResponse = client.getRow(getRequest);

// 3. Komit atau batalkan transaksi. Untuk transaksi read-only, keduanya memiliki efek yang sama dan melepaskan transaksi.
CommitTransactionRequest commitRequest = new CommitTransactionRequest(txnId);
client.commitTransaction(commitRequest);

Row row = getResponse.getRow();
System.out.println(row);

Tulis beberapa baris sekaligus dalam transaksi

Sambungkan ID transaksi ke permintaan batch write dengan memanggil BatchWriteRowRequest.setTransactionId(txnId). Nilai kunci partisi setiap baris harus sesuai dengan nilai yang digunakan saat transaksi dimulai, dan komit diterapkan secara atomik untuk semua baris.

String tableName = "local_tx_demo";

// 1. Mulai transaksi lokal. Nilai kunci partisi setiap baris dalam batch harus sesuai dengan nilai ini.
PrimaryKeyBuilder pkBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pkBuilder.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString("pkvalue"));
PrimaryKey partitionKey = pkBuilder.build();

StartLocalTransactionRequest startRequest =
        new StartLocalTransactionRequest(tableName, partitionKey);
String txnId = client.startLocalTransaction(startRequest).getTransactionID();

// 2. Buat permintaan batch write dan sertakan ID transaksi.
BatchWriteRowRequest batchRequest = new BatchWriteRowRequest();
batchRequest.setTransactionId(txnId);

// Tambahkan beberapa baris (pk1 setiap baris harus sama dengan nilai kunci partisi transaksi "pkvalue").
for (long pk2 = 20001; pk2 <= 20003; pk2++) {
    PrimaryKeyBuilder rowKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    rowKeyBuilder.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString("pkvalue"));
    rowKeyBuilder.addPrimaryKeyColumn("pk2", PrimaryKeyValue.fromLong(pk2));
    RowPutChange rowPutChange = new RowPutChange(tableName, rowKeyBuilder.build());
    rowPutChange.addColumn(new Column("col1", ColumnValue.fromString("batch_" + pk2)));
    batchRequest.addRowChange(rowPutChange);
}

BatchWriteRowResponse batchResponse = client.batchWriteRow(batchRequest);
System.out.println("Semua batch berhasil: " + batchResponse.isAllSucceed());

// 3. Komit transaksi agar semua operasi batch write diterapkan secara atomik.
CommitTransactionRequest commitRequest = new CommitTransactionRequest(txnId);
client.commitTransaction(commitRequest);