All Products
Search
Document Center

Tablestore:Transaksi lokal

Last Updated:Mar 05, 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 adalah 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 Menggunakan 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 menetapkan (commit) transaksi lokal.

Skenario kompleks: Skenario kotak surat

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

Untuk menggunakan fitur transaksi lokal secara efektif, buat dua tabel indeks pada tabel data. Tabel berikut mencantumkan kolom kunci primer untuk masing-masing tabel. Dalam tabel ini, 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 IndexField.

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: Menampilkan 100 email terakhir yang dikirim oleh pengguna

  1. Gunakan user ID 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 menetapkan transaksi lokal, atau panggil operasi AbortTransaction untuk membatalkannya.

Skenario 2: Memindahkan semua email dalam folder ke folder lain

  1. Gunakan user ID 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 menetapkan transaksi lokal.

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

  1. Gunakan user ID 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 menetapkan 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 Membuat tabel data.

Penting

Jika Anda memerlukan transaksi lokal untuk tabel data yang sudah ada tetapi tidak mengaktifkan fitur ini saat tabel dibuat, kirim 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 ditetapkan atau dibatalkan dalam waktu 60 detik, server Tablestore akan menganggap transaksi tersebut timeout dan membatalkannya.

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

  • Jika transaksi lokal tidak ditetapkan, 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 menerapkan batasan berikut pada operasi baca dan tulis 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 ditetapkan.

    • 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 tersebut yang akan berhasil. Permintaan non-transaksional lainnya atau permintaan tulis yang menyertakan ID transaksi lokal berbeda dan ditujukan untuk menulis data dalam transaksi lokal tersebut akan gagal. Data dalam transaksi lokal akan dibuka kuncinya jika transaksi ditetapkan, dibatalkan, atau mengalami 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 berdasarkan nilai kunci partisi, lalu baca dan tulis data dalam transaksi tersebut, dan akhirnya tetapkan atau batalkan transaksi sesuai kebutuhan. Contoh berikut menggunakan Tablestore SDK for Java.

Menggunakan fitur transaksi lokal untuk menulis baris data

Kode contoh berikut menunjukkan cara membuat transaksi lokal berdasarkan nilai kunci partisi tertentu dalam tabel dan cara menulis baris data dalam transaksi lokal tersebut:

private static void transactionPutRow(SyncClient client) {
    // Tentukan nama tabel data. 
    String tableName="<TABLE_NAME>";
    // Buat transaksi lokal berdasarkan nilai kunci partisi tertentu.  
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    // Tentukan nama kolom, tipe data, dan nilai kolom kunci partisi. 
    primaryKeyBuilder.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString("pkvalue"));
    PrimaryKey primaryKey = primaryKeyBuilder.build();
    // Buat permintaan untuk membuat transaksi lokal. 
    StartLocalTransactionRequest request = new StartLocalTransactionRequest(tableName, primaryKey);
    // Kirim permintaan untuk membuat transaksi lokal dan dapatkan ID transaksi lokal. 
    String txnId = client.startLocalTransaction(request).getTransactionID();
    
    // Tulis baris data dalam transaksi lokal. 
    // Konfigurasikan informasi kunci primer baris tersebut. 
    PrimaryKeyBuilder primaryKeyBuilder1 = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    // Tentukan nama kolom, tipe data, dan nilai kolom kunci primer. Jika kunci primer tabel terdiri dari beberapa kolom kunci primer, konfigurasikan informasi kolom kunci primer tersebut secara berurutan. 
    primaryKeyBuilder1.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString("pkvalue"));
    primaryKeyBuilder1.addPrimaryKeyColumn("pk2", PrimaryKeyValue.fromLong(10001));
    PrimaryKey primaryKey1 = primaryKeyBuilder1.build();
    // Konfigurasikan kolom atribut baris tersebut. 
    RowPutChange rowPutChange = new RowPutChange(tableName, primaryKey1);
    // Tentukan nama kolom, tipe data, dan nilai kolom untuk setiap kolom atribut. Tambahkan lebih banyak kolom atribut sesuai kebutuhan. 
    rowPutChange.addColumn(new Column("col1", ColumnValue.fromString("colvalue")));
    rowPutChange.addColumn(new Column("col2", ColumnValue.fromLong(10)));
    PutRowRequest request1 = new PutRowRequest(rowPutChange);
    // Sertakan ID transaksi lokal ke dalam permintaan. 
    request1.setTransactionId(txnId);
    client.putRow(request1);
    
    // Tetapkan atau batalkan transaksi lokal.  
    // Tetapkan transaksi lokal agar semua modifikasi data dalam transaksi lokal berlaku. 
    CommitTransactionRequest commitRequest = new CommitTransactionRequest(txnId);
    client.commitTransaction(commitRequest);
    // Batalkan transaksi lokal agar semua modifikasi data dalam transaksi lokal tidak berlaku. 
    //AbortTransactionRequest abortRequest = new AbortTransactionRequest(txnId);
    //client.abortTransaction(abortRequest);
}

Menggunakan fitur transaksi lokal untuk membaca baris data

Kode contoh berikut menunjukkan cara membuat transaksi lokal berdasarkan nilai kunci partisi tertentu dalam tabel dan cara membaca baris data dalam transaksi lokal tersebut:

private static void transactionGetRow(SyncClient client) {
    // Tentukan nama tabel data. 
    String tableName="exampletabled";
    // Buat transaksi lokal berdasarkan nilai kunci partisi tertentu. 
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    // Tentukan nama kolom, tipe data, dan nilai kolom kunci partisi. 
    primaryKeyBuilder.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString("111"));
    PrimaryKey primaryKey = primaryKeyBuilder.build();
    // Buat permintaan untuk membuat transaksi lokal. 
    StartLocalTransactionRequest request = new StartLocalTransactionRequest(tableName, primaryKey);
    // Kirim permintaan untuk membuat transaksi lokal dan dapatkan ID transaksi lokal. 
    String txnId = client.startLocalTransaction(request).getTransactionID();

    // Baca baris data dalam transaksi lokal. 
    // Konfigurasikan informasi kunci primer baris tersebut. 
    PrimaryKeyBuilder primaryKeyBuilder1 = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    // Tentukan nama kolom, tipe data, dan nilai kolom kunci primer. Jika kunci primer tabel terdiri dari beberapa kolom kunci primer, konfigurasikan informasi kolom kunci primer tersebut secara berurutan. 
    primaryKeyBuilder1.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString("111"));
    primaryKeyBuilder1.addPrimaryKeyColumn("pk2", PrimaryKeyValue.fromLong(10001));
    PrimaryKey primaryKey1 = primaryKeyBuilder1.build();
    SingleRowQueryCriteria criteria = new SingleRowQueryCriteria(tableName, primaryKey1);
    // Baca versi data terbaru. 
    criteria.setMaxVersions(1);
    GetRowRequest request1 = new GetRowRequest(criteria);
    // Sertakan ID transaksi lokal ke dalam permintaan. 
    request1.setTransactionId(txnId);
    GetRowResponse getRowResponse = client.getRow(request1);
  
    // Tetapkan atau batalkan transaksi lokal. Untuk operasi baca, menetapkan atau membatalkan transaksi lokal memiliki efek yang sama. 
    // Tetapkan transaksi lokal agar semua modifikasi data dalam transaksi lokal berlaku. 
    CommitTransactionRequest commitRequest = new CommitTransactionRequest(txnId);
    client.commitTransaction(commitRequest);
    // Batalkan transaksi lokal agar semua modifikasi data dalam transaksi lokal tidak berlaku. 
    //AbortTransactionRequest abortRequest = new AbortTransactionRequest(txnId);
    //client.abortTransaction(abortRequest);
    
    // Dapatkan dan tampilkan baris data. 
    Row row = getRowResponse.getRow();
    System.out.println("Baris data dibaca dan ditampilkan sebagai berikut:");
    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 serupa 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.