All Products
Search
Document Center

Tablestore:Transaksi lokal

Last Updated:Sep 21, 2026

Setelah mengaktifkan transaksi lokal untuk tabel data, Anda dapat membuat transaksi lokal berdasarkan nilai kunci partisi tertentu dan melakukan operasi baca serta tulis pada data dalam transaksi tersebut. Transaksi lokal mendukung operasi baca dan tulis atomik pada satu atau beberapa baris.

Skenario

Fitur transaksi lokal memungkinkan Anda melakukan operasi atomik untuk membaca dan menulis satu atau beberapa baris. Berikut ini contoh skenario penggunaannya:

Skenario sederhana: Baca dan tulis data

Gunakan dua metode berikut untuk melakukan operasi baca, modifikasi, dan tulis (RMW). Setiap metode memiliki batasan tertentu.

  • Pembaruan bersyarat (conditional update): hanya memproses satu permintaan yang melibatkan satu baris dalam satu waktu. Metode ini tidak dapat digunakan untuk memproses permintaan yang melibatkan beberapa baris data atau beberapa operasi tulis. Untuk informasi selengkapnya, lihat Pembaruan bersyarat.

  • Penghitung atomik (atomic counter): hanya memproses satu permintaan yang melibatkan satu baris dalam satu waktu dan hanya mendukung penambahan nilai kolom. Untuk informasi selengkapnya, lihat Gunakan fitur penghitung atomik.

Untuk mengatasi keterbatasan tersebut, Anda dapat membuat transaksi lokal guna melakukan operasi RMW pada data dalam rentang yang ditentukan oleh nilai kunci partisi.

  1. Panggil operasi StartLocalTransaction untuk membuat transaksi lokal berdasarkan nilai kunci partisi tertentu dan mendapatkan ID transaksi lokal.

  2. Panggil operasi GetRow atau GetRange untuk membaca data. Permintaan harus menyertakan ID transaksi lokal.

  3. Modifikasi data di sisi klien.

  4. Panggil operasi PutRow, UpdateRow, DeleteRow, atau BatchWriteRow untuk menulis kembali data yang telah dimodifikasi. Permintaan harus menyertakan ID transaksi lokal.

  5. Panggil operasi CommitTransaction untuk meng-commit transaksi lokal.

Skenario kompleks: Skenario kotak surat

Buat transaksi lokal untuk melakukan operasi atomik pada email pengguna tertentu.

Agar dapat menggunakan fitur transaksi lokal dengan benar, buat dua tabel indeks pada tabel data. Tabel berikut mencantumkan kolom kunci primer untuk masing-masing tabel. Kolom Type membedakan tabel data dari tabel indeks. Setiap baris indeks menggunakan kolom IndexField untuk menyimpan bidang dengan makna tertentu, sedangkan tabel data tidak memiliki kolom tersebut.

Tabel

Kolom kunci primer

UserID

Type

IndexField

MailID

Tabel data

User ID

"Main"

N/A

Email ID

Tabel indeks folder

User ID

"Folder"

$Folder

Email ID

Tabel indeks SendTime

User ID

"SendTime"

$SendTime

Email ID

Secara khusus, Anda dapat menggunakan fitur transaksi lokal untuk melakukan operasi berikut pada email.

Skenario 1: Tampilkan 100 email terakhir yang dikirim oleh pengguna

  1. Gunakan ID pengguna untuk membuat transaksi lokal dan mendapatkan ID transaksi lokal.

  2. Panggil operasi GetRange untuk mengkueri 100 email dari tabel indeks SendTime. Permintaan harus menyertakan ID transaksi lokal.

  3. Panggil operasi BatchGetRow untuk mengkueri informasi detail ke-100 email tersebut dari tabel data. Permintaan harus menyertakan ID transaksi lokal.

  4. Panggil operasi CommitTransaction untuk meng-commit transaksi lokal, atau panggil operasi AbortTransaction untuk membatalkannya.

Skenario 2: Pindahkan semua email dalam satu folder ke folder lain

  1. Gunakan ID pengguna untuk membuat transaksi lokal dan mendapatkan ID transaksi lokal.

  2. Panggil operasi GetRange untuk mengkueri email dari tabel indeks Folder. Permintaan harus menyertakan ID transaksi lokal.

  3. Panggil operasi BatchWriteRow untuk melakukan operasi tulis pada tabel indeks Folder. Permintaan harus menyertakan ID transaksi lokal.

    Operasi tulis dilakukan pada dua baris setiap kali email dipindahkan: satu baris yang merepresentasikan folder asal dihapus dari tabel indeks Folder, dan satu baris baru yang merepresentasikan folder tujuan ditambahkan ke tabel indeks tersebut.

  4. Panggil operasi CommitTransaction untuk meng-commit transaksi lokal.

Skenario 3: Hitung jumlah email yang sudah dibaca dan belum dibaca dalam suatu folder

  1. Gunakan ID pengguna untuk membuat transaksi lokal dan mendapatkan ID transaksi lokal.

  2. Panggil operasi GetRange untuk mengkueri email dari tabel indeks Folder. Permintaan harus menyertakan ID transaksi lokal.

  3. Panggil operasi BatchGetRow untuk mengkueri status baca setiap email dari tabel data.

  4. Panggil operasi CommitTransaction untuk meng-commit transaksi lokal, atau panggil operasi AbortTransaction untuk membatalkannya.

Solusi ini tidak optimal. Dalam skenario ini, tambahkan lebih banyak tabel indeks untuk mempercepat kueri. Fitur transaksi lokal memastikan konsistensi status antara tabel data dan tabel indeks, sehingga menyederhanakan pengembangan. Misalnya, solusi penghitungan email ini memerlukan pembacaan banyak email dan menyebabkan overhead tinggi. Untuk mengurangi overhead dan mempercepat kueri, gunakan tabel indeks baru untuk menyimpan jumlah email yang sudah dibaca dan belum dibaca.

Sebelum memulai

Anda harus mengaktifkan transaksi lokal saat membuat tabel data. Gunakan Konsol Tablestore, Tablestore SDK for Java V5.11.0 atau versi yang lebih baru, atau versi terbaru Tablestore SDK for Go. Untuk informasi selengkapnya, lihat Buat tabel data.

Penting

Jika Anda membutuhkan transaksi lokal untuk tabel data yang sudah ada tetapi tidak mengaktifkan fitur ini saat pembuatan tabel, ajukan tiket. Anda juga dapat bergabung dengan grup DingTalk 36165029092 (Tablestore Technical Discussion Group-3) untuk mendapatkan bantuan

Catatan penggunaan

  • Fitur kolom kunci utama auto-increment dan transaksi lokal tidak dapat digunakan secara bersamaan.

  • Penguncian pesimistik (pessimistic locking) digunakan untuk mengontrol operasi konkuren dalam transaksi lokal.

  • Masa berlaku transaksi lokal maksimal 60 detik.

    Jika transaksi lokal tidak di-commit atau dibatalkan dalam waktu 60 detik, server Tablestore akan menganggap transaksi tersebut timeout dan membatalkannya.

  • Transaksi mungkin telah dibuat di server Tablestore meskipun error timeout dikembalikan. Dalam kasus ini, Anda dapat mengirim ulang permintaan pembuatan transaksi setelah transaksi sebelumnya timeout.

  • Jika transaksi lokal tidak di-commit, transaksi tersebut mungkin menjadi tidak valid. Dalam hal ini, ulangi operasi dalam transaksi tersebut.

  • Jika tidak ada operasi tulis yang dilakukan pada data dalam transaksi lokal, operasi commit dan abort memiliki efek yang sama.

  • Tablestore memberlakukan batasan berikut pada operasi baca dan tulis terhadap data dalam transaksi lokal:

    • ID transaksi lokal tidak dapat digunakan untuk mengakses data di luar rentang yang ditentukan oleh nilai kunci partisi yang digunakan saat membuat transaksi.

    • Nilai kunci partisi dari semua permintaan tulis dalam transaksi yang sama harus sama dengan nilai kunci partisi yang digunakan untuk membuat transaksi. Batasan ini tidak berlaku untuk permintaan baca.

    • Transaksi lokal hanya dapat digunakan oleh satu permintaan dalam satu waktu. Saat transaksi lokal sedang digunakan, operasi lain yang menggunakan ID transaksi lokal yang sama akan gagal.

    • Interval maksimum antara dua operasi baca atau tulis berturut-turut pada data dalam transaksi lokal adalah 60 detik.

      Jika tidak ada operasi baca atau tulis yang dilakukan pada data dalam transaksi lokal selama lebih dari 60 detik, server Tablestore akan menganggap transaksi tersebut timeout dan membatalkannya.

    • Maksimal 4 MB data dapat ditulis ke setiap transaksi. Volume data yang ditulis ke setiap transaksi dihitung dengan cara yang sama seperti pada permintaan tulis biasa.

    • Jika Anda tidak menentukan nomor versi untuk suatu sel, server Tablestore secara otomatis menetapkan nomor versi ke sel tersebut dengan cara biasa saat sel tersebut ditulis ke transaksi, bukan saat transaksi di-commit.

    • Jika permintaan BatchWriteRow mencakup ID transaksi lokal, semua baris dalam permintaan tersebut hanya dapat ditulis ke tabel yang sesuai dengan ID transaksi lokal tersebut.

    • Saat menggunakan transaksi lokal, kunci tulis (write lock) diterapkan pada data dengan nilai kunci partisi tempat transaksi lokal dibuat. Hanya permintaan tulis yang menyertakan ID transaksi lokal dan ditujukan untuk menulis data dalam transaksi lokal yang dapat berhasil. Permintaan non-transaksional lainnya atau permintaan tulis yang menyertakan ID transaksi lokal berbeda dan ditujukan untuk menulis data dalam transaksi lokal akan gagal. Data dalam transaksi lokal akan dibuka kuncinya jika transaksi di-commit atau dibatalkan, atau jika transaksi timeout.

    • Transaksi lokal tetap valid meskipun permintaan baca atau tulis dengan ID transaksi lokal tersebut ditolak. Tentukan aturan pengulangan (retry rule) untuk mengirim ulang permintaan, atau batalkan transaksi tersebut.

Prosedur

Penting

Kelola transaksi lokal hanya dengan menggunakan SDK Tablestore.

Untuk menggunakan transaksi lokal, pertama-tama buat transaksi lokal untuk nilai kunci partisi, lalu baca dan tulis data dalam transaksi tersebut, dan akhirnya commit atau batalkan transaksi sesuai kebutuhan. Contoh berikut menggunakan Tablestore SDK for Java.

Gunakan fitur transaksi lokal untuk menulis baris data

Contoh berikut membuat transaksi lokal untuk nilai kunci partisi tertentu dari tabel dan menulis satu baris dalam transaksi lokal tersebut.

String tableName = "local_tx_demo";

// 1. Mulai transaksi lokal untuk nilai kunci partisi tertentu dan dapatkan 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. Commit transaksi agar semua operasi tulis berlaku. Untuk membuang perubahan, panggil abortTransaction() sebagai gantinya.
CommitTransactionRequest commitRequest = new CommitTransactionRequest(txnId);
client.commitTransaction(commitRequest);

Gunakan fitur transaksi lokal untuk membaca baris data

Contoh berikut membuat transaksi lokal untuk nilai kunci partisi tertentu dari tabel dan membaca satu baris dalam transaksi lokal tersebut.

String tableName = "local_tx_demo";

// 1. Mulai transaksi lokal untuk nilai kunci partisi tertentu.
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. Commit 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);

Integrasi SDK

Gunakan transaksi lokal dengan SDK berikut.

Penagihan

  • Setiap operasi StartLocalTransaction, CommitTransaction, dan AbortTransaction mengonsumsi satu unit kapasitas tulis (CU).

  • Operasi baca dan tulis ditagih mirip dengan permintaan baca dan tulis standar. Untuk informasi selengkapnya tentang penagihan, lihat Ikhtisar penagihan.

Kode error

Kode error

Deskripsi

OTSRowOperationConflict

Nilai kunci partisi sudah digunakan oleh transaksi lokal lain.

OTSSessionNotExist

Transaksi yang sesuai dengan ID transaksi yang ditentukan tidak ada, atau transaksi tersebut tidak valid atau timeout.

OTSSessionBusy

Permintaan terakhir pada transaksi belum selesai.

OTSOutOfTransactionDataSizeLimit

Jumlah data dalam transaksi melebihi batas atas.

OTSDataOutOfRange

Operasi data berada di luar rentang yang ditentukan oleh nilai kunci partisi yang digunakan untuk membuat transaksi.