全部产品
Search
文档中心

Tablestore:Gunakan fitur transaksi lokal

更新时间:Jul 02, 2025

Setelah mengaktifkan fitur transaksi lokal pada tabel data, Anda dapat membuat transaksi lokal berdasarkan nilai kunci partisi tertentu dan melakukan operasi baca serta tulis dalam transaksi tersebut. Fitur ini memungkinkan operasi atomik untuk membaca dan menulis satu atau beberapa baris. Kunci pesimistis digunakan untuk mengontrol konkurensi dalam transaksi lokal.

Transaksi lokal memastikan bahwa semua operasi pada data dengan kunci partisi yang sama berhasil atau gagal secara keseluruhan. Tingkat isolasi transaksi lokal adalah Baca Terkonfirmasi.

Prasyarat

  • Klien telah diinisialisasi. Untuk informasi lebih lanjut, lihat Inisialisasi Klien Tablestore.

  • Tabel data tempat fitur transaksi lokal diaktifkan telah dibuat.

    Catatan

    Jika Anda tidak mengaktifkan fitur transaksi lokal saat membuat tabel data dan ingin menggunakannya setelah tabel dibuat, ajukan Tiket.

Prosedur

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

  2. Baca dan tulis data dalam transaksi lokal.

    Anda dapat memanggil operasi GetRow, PutRow, DeleteRow, UpdateRow, BatchWriteRow, dan GetRange untuk melakukan operasi pada data dalam transaksi lokal.

  3. Panggil operasi CommitTransaction untuk mengonfirmasi transaksi lokal, atau panggil operasi AbortTransaction untuk membatalkannya.

Catatan penggunaan

  • Fitur kolom primary key auto-increment dan fitur transaksi lokal tidak dapat digunakan secara bersamaan.

  • Kunci pesimistis digunakan untuk mengontrol operasi konkuren dalam transaksi lokal.

  • Masa berlaku transaksi lokal maksimal adalah 60 detik.

    Jika transaksi lokal tidak dikonfirmasi atau dibatalkan dalam waktu 60 detik, server Tablestore akan menentukan bahwa transaksi tersebut kedaluwarsa dan membatalkannya.

  • Meskipun kesalahan timeout dikembalikan, transaksi mungkin tetap dibuat di server Tablestore. Dalam hal ini, Anda dapat mengirim ulang permintaan pembuatan transaksi setelah transaksi sebelumnya kedaluwarsa.

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

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

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

    • ID transaksi lokal tidak dapat digunakan untuk mengakses data di luar rentang yang ditentukan berdasarkan nilai kunci partisi yang digunakan untuk 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 pada 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 menentukan bahwa transaksi tersebut kedaluwarsa dan membatalkannya.

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

    • Jika Anda tidak menentukan nomor versi untuk sebuah cell, server Tablestore secara otomatis menetapkan nomor versi ke cell tersebut dengan cara biasa ketika cell tersebut ditulis ke transaksi, bukan ketika transaksi dikonfirmasi.

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

    • Saat menggunakan transaksi lokal, kunci tulis ditambahkan ke data dari nilai kunci partisi berdasarkan mana transaksi lokal dibuat. Hanya permintaan tulis yang berisi ID transaksi lokal dan diinisiasi untuk menulis data dalam transaksi lokal yang dapat berhasil. Permintaan non-transaksional lainnya atau permintaan tulis yang berisi ID transaksi lokal lainnya dan diinisiasi untuk menulis data dalam transaksi lokal akan gagal. Data dalam transaksi lokal dibuka kuncinya jika transaksi dikonfirmasi atau dibatalkan, atau jika transaksi kedaluwarsa.

    • Transaksi lokal tetap valid meskipun permintaan baca atau tulis dengan ID transaksi lokal ditolak. Anda dapat menentukan aturan pengulangan untuk mengirim ulang permintaan, atau Anda dapat membatalkan transaksi.

Parameter

Parameter

Deskripsi

NamaTabel

Nama tabel data.

KunciUtama

Kunci utama tabel data.

  • Anda harus menentukan nilai kunci partisi saat membuat transaksi lokal.

  • Anda harus menentukan semua kolom kunci utama saat membaca dan menulis data dalam transaksi lokal.

IDTransaksi

ID transaksi lokal yang secara unik mengidentifikasi transaksi lokal.

Anda harus menentukan ID transaksi lokal saat membaca dan menulis data dalam transaksi lokal.

Contoh kode

Gunakan 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:

private static void transactionPutRow(SyncClient client) {
    // Tentukan nama tabel data. 
    String tableName="<TABLE_NAME>";
    // Buat transaksi lokal berdasarkan nilai kunci partisi yang ditentukan.  
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    // Tentukan nama kolom, tipe data, dan nilai kolom kunci partisi. 
    primaryKeyBuilder.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString("pkvalue"));
    PrimaryKey primaryKey = primaryKeyBuilder.build();
    // Konstruksi permintaan untuk membuat transaksi lokal. 
    StartLocalTransactionRequest request = new StartLocalTransactionRequest(tableName, primaryKey);
    // Ajukan 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 utama dari baris. 
    PrimaryKeyBuilder primaryKeyBuilder1 = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    // Tentukan nama kolom, tipe data, dan nilai kolom kunci utama. Jika kunci utama tabel terdiri dari beberapa kolom kunci utama, konfigurasikan informasi tentang kolom kunci utama secara berurutan. 
    primaryKeyBuilder1.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString("pkvalue"));
    primaryKeyBuilder1.addPrimaryKeyColumn("pk2", PrimaryKeyValue.fromLong(10001));
    PrimaryKey primaryKey1 = primaryKeyBuilder1.build();
    // Konfigurasikan kolom atribut dari baris. 
    RowPutChange rowPutChange = new RowPutChange(tableName, primaryKey1);
    // Tentukan nama kolom, tipe data, dan nilai kolom 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);
    // Kirim ID transaksi lokal ke permintaan. 
    request1.setTransactionId(txnId);
    client.putRow(request1);
    
    // Konfirmasi atau batalkan transaksi lokal.  
    // Konfirmasi transaksi lokal sehingga semua modifikasi data dalam transaksi lokal diterapkan. 
    CommitTransactionRequest commitRequest = new CommitTransactionRequest(txnId);
    client.commitTransaction(commitRequest);
    // Batalkan transaksi lokal sehingga semua modifikasi data dalam transaksi lokal tidak diterapkan. 
    //AbortTransactionRequest abortRequest = new AbortTransactionRequest(txnId);
    //client.abortTransaction(abortRequest);
}

Gunakan 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:

private static void transactionGetRow(SyncClient client) {
    // Tentukan nama tabel data. 
    String tableName="exampletabled";
    // Buat transaksi lokal berdasarkan nilai kunci partisi yang ditentukan. 
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    // Tentukan nama kolom, tipe data, dan nilai kolom kunci partisi. 
    primaryKeyBuilder.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString("111"));
    PrimaryKey primaryKey = primaryKeyBuilder.build();
    // Konstruksi permintaan untuk membuat transaksi lokal. 
    StartLocalTransactionRequest request = new StartLocalTransactionRequest(tableName, primaryKey);
    // Ajukan 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 utama dari baris. 
    PrimaryKeyBuilder primaryKeyBuilder1 = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    // Tentukan nama kolom, tipe data, dan nilai kolom kunci utama. Jika kunci utama tabel terdiri dari beberapa kolom kunci utama, konfigurasikan informasi tentang kolom kunci utama 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 terbaru dari data. 
    criteria.setMaxVersions(1);
    GetRowRequest request1 = new GetRowRequest(criteria);
    // Kirim ID transaksi lokal ke permintaan. 
    request1.setTransactionId(txnId);
    GetRowResponse getRowResponse = client.getRow(request1);
  
    // Konfirmasi atau batalkan transaksi lokal. Untuk operasi baca, mengonfirmasi atau membatalkan transaksi lokal memiliki efek yang sama. 
    // Konfirmasi transaksi lokal sehingga semua modifikasi data dalam transaksi lokal diterapkan. 
    CommitTransactionRequest commitRequest = new CommitTransactionRequest(txnId);
    client.commitTransaction(commitRequest);
    // Batalkan transaksi lokal sehingga semua modifikasi data dalam transaksi lokal tidak diterapkan. 
    //AbortTransactionRequest abortRequest = new AbortTransactionRequest(txnId);
    //client.abortTransaction(abortRequest);
    
    // Dapatkan dan tampilkan baris data. 
    Row row = getRowResponse.getRow();
    System.out.println("Baris data telah dibaca dan ditampilkan sebagai berikut:");
    System.out.println(row);
}

Referensi

Untuk menulis beberapa baris data sekaligus atau membaca data yang nilai kunci partisinya berada dalam rentang tertentu, buat transaksi lokal. Kemudian, rujuk ke kode contoh yang disediakan dalam topik Menulis Data atau Membaca Data untuk mengajukan permintaan dengan ID transaksi lokal termasuk dalam permintaan.