Setelah mengaktifkan fitur 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. Fitur ini mendukung operasi atomik untuk membaca dan menulis satu atau beberapa baris.
Skema Penggunaan
Fitur transaksi lokal memungkinkan Anda melakukan operasi atomik untuk membaca dan menulis satu atau beberapa baris. Berikut adalah skenario contoh penggunaannya:
Skema Sederhana: Membaca dan Menulis Data
Anda dapat menggunakan dua metode berikut untuk melakukan operasi baca, modifikasi, dan tulis (RMW). Setiap metode memiliki batasan tertentu.
Pembaruan bersyarat: Memproses satu permintaan yang melibatkan satu baris pada satu waktu. Metode ini tidak mendukung permintaan yang melibatkan beberapa baris data atau permintaan dengan beberapa operasi tulis. Untuk informasi lebih lanjut, lihat Pembaruan Bersyarat.
Penghitung atomik: Memproses satu permintaan yang melibatkan satu baris pada satu waktu, hanya mendukung penambahan nilai kolom. Untuk informasi lebih lanjut, lihat Gunakan Fitur Penghitung Atomik.
Untuk mengatasi keterbatasan di atas, Anda dapat membuat transaksi lokal untuk melakukan operasi RMW pada data dalam rentang yang ditentukan oleh nilai kunci partisi.
Panggil operasi StartLocalTransaction untuk membuat transaksi lokal berdasarkan nilai kunci partisi tertentu dan peroleh ID transaksi lokal.
Panggil operasi GetRow atau GetRange untuk membaca data. Permintaan harus mencakup ID transaksi lokal.
Modifikasi data di sisi klien.
Panggil operasi PutRow, UpdateRow, DeleteRow, atau BatchWriteRow untuk menulis kembali data yang telah dimodifikasi. Permintaan harus mencakup ID transaksi lokal.
Panggil operasi CommitTransaction untuk mengonfirmasi transaksi lokal.
Skema Kompleks: Mengelola Email
Anda dapat membuat transaksi lokal untuk melakukan operasi atomik pada email pengguna tertentu.
Untuk menggunakan fitur transaksi lokal, sertakan dua tabel indeks dalam tabel data. Tabel berikut menjelaskan kolom kunci utama dari tabel data dan tabel indeks. Kolom Type digunakan untuk mengidentifikasi baris-baris tabel data dan tabel indeks. Kolom IndexField menyimpan bidang $Folder untuk tabel indeks Folder, dan bidang $SendTime untuk tabel indeks SendTime. Kolom IndexField kosong untuk tabel data.
Tabel | Kolom Kunci Utama | |||
UserID | Type | IndexField | MailID | |
Tabel data | ID Pengguna | "Main" | N/A | ID Email |
Tabel indeks Folder | ID Pengguna | "Folder" | $Folder | ID Email |
Tabel indeks SendTime | ID Pengguna | "SendTime" | $SendTime | ID Email |
Secara khusus, Anda dapat menggunakan fitur transaksi lokal untuk melakukan operasi berikut pada email.
Skenario 1: Daftar 100 email terakhir yang dikirim oleh pengguna
Gunakan ID pengguna untuk membuat transaksi lokal dan peroleh ID transaksi lokal.
Panggil operasi GetRange untuk menanyakan 100 email dari tabel indeks SendTime. Permintaan harus mencakup ID transaksi lokal.
Panggil operasi BatchGetRow untuk menanyakan informasi detail dari 100 email dari tabel data. Permintaan harus mencakup ID transaksi lokal.
Panggil operasi CommitTransaction untuk mengonfirmasi transaksi lokal, atau panggil operasi AbortTransaction untuk membatalkan transaksi lokal.
Skema 2: Pindahkan semua email dalam folder ke folder lain
Gunakan ID pengguna untuk membuat transaksi lokal dan peroleh ID transaksi lokal.
Panggil operasi GetRange untuk menanyakan email dari tabel indeks Folder. Permintaan harus mencakup ID transaksi lokal.
Panggil operasi BatchWriteRow untuk melakukan operasi tulis pada tabel indeks Folder. Permintaan harus mencakup ID transaksi lokal.
Operasi tulis dilakukan pada dua baris setiap kali email dipindahkan. Secara spesifik, baris yang menunjukkan folder asal dihapus dari tabel indeks Folder, dan baris yang menunjukkan folder baru ditambahkan ke tabel indeks Folder.
Panggil operasi CommitTransaction untuk mengonfirmasi transaksi lokal.
Skema 3: Hitung jumlah email yang telah dibaca dan belum dibaca dalam folder
Gunakan ID pengguna untuk membuat transaksi lokal dan peroleh ID transaksi lokal.
Panggil operasi GetRange untuk menanyakan email dari tabel indeks Folder. Permintaan harus mencakup ID transaksi lokal.
Panggil operasi BatchGetRow untuk menanyakan status baca setiap email dari tabel data.
Panggil operasi CommitTransaction untuk mengonfirmasi transaksi lokal, atau panggil operasi AbortTransaction untuk membatalkan transaksi lokal.
Solusi ini bukan yang optimal. Dalam skenario ini, Anda dapat menambahkan lebih banyak tabel indeks untuk mempercepat kueri. Fitur transaksi lokal memastikan konsistensi status antara tabel data dan tabel indeks, sehingga menyederhanakan pengembangan. Misalnya, ketika Anda menggunakan solusi ini untuk menghitung jumlah email, sejumlah besar email perlu dibaca, yang menyebabkan overhead tinggi. Untuk mengurangi overhead dan mempercepat kueri, Anda dapat menggunakan tabel indeks baru untuk menyimpan jumlah email yang telah dibaca dan belum dibaca.
Sebelum Memulai
Pastikan bahwa fitur transaksi lokal diaktifkan untuk tabel data yang akan dikelola.
Fitur transaksi lokal tersedia untuk pratinjau undangan. Secara default, fitur ini dinonaktifkan. Untuk menggunakan fitur transaksi lokal, ajukan tiket.
Jika Anda menggunakan Tablestore SDK for Java V5.11.0 atau versi lebih baru, Anda dapat mengaktifkan fitur transaksi lokal saat membuat tabel data. Untuk informasi lebih lanjut, lihat Operasi pada tabel data.
Catatan Penggunaan
Anda tidak dapat menggunakan fitur kolom kunci utama auto-increment dan fitur transaksi lokal secara bersamaan.
Kunci pesimistik digunakan untuk mengontrol operasi konkuren dalam transaksi lokal.
Masa berlaku transaksi lokal maksimum adalah 60 detik.
Jika transaksi lokal tidak dikonfirmasi atau dibatalkan dalam 60 detik, server Tablestore menentukan bahwa transaksi habis waktu dan membatalkan transaksi.
Transaksi mungkin tetap dibuat di server Tablestore meskipun kesalahan timeout dikembalikan. Dalam hal ini, Anda dapat mengirim ulang permintaan pembuatan transaksi setelah transaksi yang dibuat habis waktu.
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 pada data 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 untuk 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 menentukan bahwa transaksi habis waktu dan membatalkan transaksi.
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 sel, server Tablestore secara otomatis menetapkan nomor versi ke sel dengan cara biasa saat sel ditulis ke transaksi, bukan saat transaksi dikonfirmasi.
Jika permintaan BatchWriteRow mencakup ID transaksi lokal, semua baris dalam permintaan hanya dapat ditulis ke tabel yang sesuai dengan ID transaksi lokal.
Saat Anda menggunakan transaksi lokal, kunci tulis ditambahkan ke data 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 lain dan diinisiasi untuk menulis data dalam transaksi lokal akan gagal. Data dalam transaksi lokal dibuka kuncinya jika transaksi dikonfirmasi atau dibatalkan, atau jika transaksi habis waktu.
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.
Operasi API
Tabel berikut menjelaskan operasi API yang dapat dipanggil untuk mengelola transaksi lokal.
Operasi API | Deskripsi |
StartLocalTransaction | Membuat transaksi lokal. |
CommitTransaction | Mengonfirmasi transaksi lokal. |
AbortTransaction | Membatalkan transaksi lokal. |
Anda dapat memanggil operasi GetRow, PutRow, UpdateRow, DeleteRow, GetRange, atau BatchWriteRow untuk mengelola data dalam transaksi lokal. Untuk informasi lebih lanjut, lihat Menulis Data, Membaca Data, dan Menghapus Data.
Baris dalam transaksi lokal berbagi nilai kunci partisi yang sama. Untuk informasi lebih lanjut tentang kunci partisi, lihat bagian Kunci Partisi dari topik "Kunci Utama dan Atribut".
Gunakan Fitur Transaksi Lokal
Sebelum menggunakan fitur transaksi lokal, Anda harus membuat transaksi lokal berdasarkan nilai kunci partisi. Kemudian, Anda dapat melakukan operasi baca dan tulis pada data dalam transaksi lokal. Setelah selesai, Anda dapat mengonfirmasi atau membatalkan transaksi lokal sesuai kebutuhan.
Anda hanya dapat mengelola transaksi lokal dengan menggunakan SDK Tablestore.
SDK Tablestore berikut didukung: Tablestore SDK for Java, Tablestore SDK for Go, Tablestore SDK for Python, Tablestore SDK for Node.js, dan Tablestore SDK for PHP. Contoh berikut menunjukkan cara menggunakan fitur transaksi lokal untuk melakukan operasi baca dan tulis. Dalam contoh-contoh tersebut, Tablestore SDK for Java digunakan.
Gunakan Fitur Transaksi Lokal untuk Menulis Baris Data
Kode sampel 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);
// Kirim permintaan untuk membuat transaksi lokal dan peroleh ID transaksi lokal.
String txnId = client.startLocalTransaction(request).getTransactionID();
// Tulis baris data dalam transaksi lokal.
// Konfigurasikan informasi kunci utama 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 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);
// Teruskan 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 berlaku.
CommitTransactionRequest commitRequest = new CommitTransactionRequest(txnId);
client.commitTransaction(commitRequest);
// Batalkan transaksi lokal sehingga semua modifikasi data dalam transaksi lokal tidak berlaku.
//AbortTransactionRequest abortRequest = new AbortTransactionRequest(txnId);
//client.abortTransaction(abortRequest);
}Gunakan Fitur Transaksi Lokal untuk Membaca Baris Data
Kode sampel 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);
// Kirim permintaan untuk membuat transaksi lokal dan peroleh ID transaksi lokal.
String txnId = client.startLocalTransaction(request).getTransactionID();
// Baca baris data dalam transaksi lokal.
// Konfigurasikan informasi kunci utama 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 data.
criteria.setMaxVersions(1);
GetRowRequest request1 = new GetRowRequest(criteria);
// Teruskan 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 berlaku.
CommitTransactionRequest commitRequest = new CommitTransactionRequest(txnId);
client.commitTransaction(commitRequest);
// Batalkan transaksi lokal sehingga semua modifikasi data dalam transaksi lokal tidak berlaku.
//AbortTransactionRequest abortRequest = new AbortTransactionRequest(txnId);
//client.abortTransaction(abortRequest);
// Peroleh dan tampilkan baris data.
Row row = getRowResponse.getRow();
System.out.println("Baris data telah dibaca dan ditampilkan sebagai berikut:");
System.out.println(row);
}Penagihan
Setiap operasi StartLocalTransaction, CommitTransaction, dan AbortTransaction mengonsumsi satu unit kapasitas tulis (CU).
Anda dikenakan biaya untuk operasi baca dan tulis pada data dalam transaksi lokal dengan cara yang sama seperti ketika Anda melakukan operasi baca dan tulis umum pada data. Untuk informasi lebih lanjut tentang penagihan, lihat Ikhtisar Penagihan.
Kode Kesalahan
Kode Kesalahan | Deskripsi |
OTSRowOperationConflict | Nilai kunci partisi sudah digunakan oleh transaksi lokal lain. |
OTSSessionNotExist | Transaksi yang sesuai dengan ID transaksi yang ditentukan tidak ada, atau transaksi tidak valid atau habis waktu. |
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. |