Setelah mengaktifkan fitur transaksi lokal pada tabel data, Anda dapat membuat transaksi lokal berdasarkan nilai kunci partisi tertentu dan melakukan operasi baca serta tulis terhadap data dalam transaksi tersebut. Fitur ini memungkinkan Anda menjalankan operasi atomik untuk membaca dan menulis satu atau beberapa baris.
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.
CatatanJika Anda tidak mengaktifkan fitur transaksi lokal saat membuat tabel data dan ingin menggunakannya setelah pembuatan tabel, ajukan Tiket.
Gunakan fitur transaksi lokal
Gunakan start_local_transaction untuk membuat transaksi lokal berdasarkan nilai kunci partisi tertentu dan mendapatkan ID transaksi lokal.
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.
Gunakan commit_transaction untuk mengonfirmasi transaksi lokal atau abort_transaction untuk membatalkannya.
Catatan penggunaan
Fitur kolom primary key auto-increment dan fitur transaksi lokal tidak dapat digunakan secara bersamaan.
Penguncian 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 menganggap transaksi tersebut kedaluwarsa dan membatalkannya.
Meskipun kesalahan timeout dikembalikan, transaksi mungkin tetap dibuat di server Tablestore. Dalam kasus ini, Anda dapat mengirim ulang permintaan pembuatan transaksi setelah transaksi sebelumnya kedaluwarsa.
Jika transaksi lokal tidak dikonfirmasi, transaksi tersebut mungkin menjadi tidak valid. Ulangi operasi dalam transaksi ini jika diperlukan.
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 sesuai 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 menganggap transaksi tersebut kedaluwarsa dan membatalkannya.
Maksimal 4 MB data dapat ditulis ke setiap transaksi. Volume data yang ditulis 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 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 lain dan diinisiasi untuk menulis data dalam transaksi lokal akan gagal. Data dalam transaksi lokal dibuka kuncinya jika transaksi dikonfirmasi, dibatalkan, atau 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 |
table_name | Nama tabel data. |
key | Kunci partisi tabel data. Anda harus menentukan nilai kunci partisi saat Anda membuat transaksi lokal. |
primary_key | Primary key tabel data. Anda harus menentukan nilai semua kolom primary key saat Anda membaca dan menulis data dalam transaksi lokal. |
transaction_id | ID transaksi lokal yang secara unik mengidentifikasi transaksi lokal. Anda harus menentukan ID transaksi lokal saat Anda membaca dan menulis data dalam transaksi lokal. |
Contoh
Gunakan fitur transaksi lokal untuk menulis satu baris data
Kode sampel berikut menunjukkan cara membuat transaksi lokal berdasarkan nilai kunci partisi tertentu dalam tabel dan menulis satu baris data dalam transaksi lokal. Jika satu baris data berhasil ditulis dalam transaksi lokal, konfirmasi transaksi. Jika tidak, batalkan transaksi.
def transaction_put_row(client):
# Tentukan nama tabel data.
table_name = '<TABLE_NAME>'
# Buat transaksi lokal berdasarkan kunci partisi PK0.
key = [('PK0', 1)]
# Nilai yang dikembalikan oleh metode start_local_transaction adalah ID transaksi.
transaction_id = client.start_local_transaction(table_name, key)
# Tulis data.
primary_key = [('PK0', 1), ('PK1', 'transaction')]
attribute_columns = [('value', 'nilai asli')]
row = Row(primary_key, attribute_columns)
condition = Condition(RowExistenceExpectation.IGNORE)
try:
# Jika Anda tidak menentukan parameter ReturnType saat Anda memanggil metode put_row, nilai parameter return_row adalah None.
consumed, return_row = client.put_row(table_name, row, condition, None, transaction_id)
# Tampilkan jumlah CU tulis yang dikonsumsi oleh permintaan.
print('put row berhasil, konsumsi %s write cu.' % consumed.write)
# Jika satu baris data ditulis dalam transaksi lokal, konfirmasi transaksi lokal. Dalam hal ini, semua modifikasi data dalam transaksi lokal berlaku. Anda dapat membatalkan transaksi lokal untuk membatalkan semua modifikasi data dalam transaksi lokal.
client.commit_transaction(transaction_id)
# Dalam banyak kasus, pengecualian klien disebabkan oleh kesalahan parameter atau pengecualian jaringan.
except OTSClientError as e:
print("put row gagal, http_status:%d, error_message:%s" % (e.get_http_status(), e.get_error_message()))
# Jika satu baris data gagal ditulis dalam transaksi lokal, batalkan transaksi lokal. Dalam hal ini, semua modifikasi data dalam transaksi lokal tidak berlaku untuk data dalam tabel data.
client.abort_transaction(transaction_id)
# Dalam banyak kasus, pengecualian server disebabkan oleh kesalahan parameter atau throttling.
except OTSServiceError as e:
print("put row gagal, http_status:%d, error_code:%s, error_message:%s, request_id:%s" % (e.get_http_status(), e.get_error_code(), e.get_error_message(), e.get_request_id()))
# Jika satu baris data gagal ditulis dalam transaksi lokal, batalkan transaksi lokal. Dalam hal ini, semua modifikasi data dalam transaksi lokal tidak berlaku untuk data dalam tabel data.
client.abort_transaction(transaction_id)Gunakan fitur transaksi lokal untuk membaca satu baris data
Kode sampel berikut menunjukkan cara membuat transaksi lokal berdasarkan nilai kunci partisi tertentu dalam tabel dan membaca satu baris data dalam transaksi lokal:
def transaction_get_row(client):
# Tentukan nama tabel data.
table_name ='<TABLE_NAME>'
# Buat transaksi lokal berdasarkan kunci partisi PK0.
key = [('PK0', 1)]
# Nilai yang dikembalikan oleh metode start_local_transaction adalah ID transaksi.
transaction_id = client.start_local_transaction(table_name, key)
# Baca data.
primary_key = [('PK0', 1), ('PK1', 'transaction')]
columns_to_get = ['value']
consumed, return_row, next_token = client.get_row(
table_name, primary_key, columns_to_get, None, 1, None, None, None, None, transaction_id
)
for att in return_row.attribute_columns:
print ('\tname:%s\tvalue:%s' % (att[0], att[1]))
Konfirmasi atau batalkan transaksi lokal. Efek pada operasi baca saat Anda mengonfirmasi atau membatalkan transaksi lokal adalah sama.
# Konfirmasi transaksi lokal agar semua modifikasi data dalam transaksi lokal berlaku.
client.commit_transaction(transaction_id)
# Batalkan transaksi lokal. Dalam hal ini, semua modifikasi data dalam transaksi lokal tidak berlaku untuk data dalam tabel data.
#client.abort_transaction(transaction_id)Referensi
Untuk menulis beberapa baris data sekaligus atau membaca data yang nilai primary key-nya berada dalam rentang tertentu, buat transaksi lokal. Kemudian, lihat kode sampel yang diberikan dalam topik Tulis Data atau Baca Data untuk menginisiasi permintaan yang mencakup ID transaksi lokal.