Gunakan Tablestore SDK for Python untuk mengelompokkan operasi baca dan tulis pada satu nilai kunci partisi ke dalam operasi atomik yang semua penulisannya dikomit atau dibatalkan secara bersamaan.
Prasyarat
Instal Tablestore SDK for Python dan inisialisasi klien.
-
Transaksi lokal telah diaktifkan untuk tabel tersebut.
CatatanUntuk mengaktifkan transaksi lokal pada tabel yang sudah ada atau memeriksa apakah fitur tersebut telah diaktifkan, kirimkan tiket.
Deskripsi fungsi
Transaksi lokal hanya berlaku untuk satu nilai kunci partisi dan menggunakan tingkat isolasi Read Committed. Permintaan dalam transaksi berbagi ID transaksi. Gunakan transaksi lokal sebagai berikut:
Panggil
start_local_transactiondengan nilai kunci partisi untuk mendapatkan ID transaksi.Panggil
get_row,put_row,update_row,delete_row,batch_write_row, atauget_rangedalam transaksi dan sertakan ID tersebut dalam parametertransaction_id.Panggil
commit_transactionuntuk mengomit semua penulisan atauabort_transactionuntuk membatalkan semua penulisan.
def start_local_transaction(self, table_name, key)
def commit_transaction(self, transaction_id)
def abort_transaction(self, transaction_id)
Contoh berikut memulai transaksi lokal untuk nilai kunci partisi device, menulis baris, lalu melakukan commit transaksi.
table_name = "example_table"
partition_key = [("partition", "device")]
transaction_id = client.start_local_transaction(table_name, partition_key)
primary_key = [("partition", "device"), ("id", 1)]
row = Row(primary_key, [("status", "online")])
condition = Condition(RowExistenceExpectation.IGNORE)
client.put_row(
table_name,
row,
condition,
transaction_id=transaction_id,
)
client.commit_transaction(transaction_id)
Parameter
Transaksi lokal mencakup parameter utama berikut.
|
Name |
Type |
Description |
|
table_name (required) |
|
Nama tabel. |
|
key (required) |
|
Kunci partisi yang digunakan untuk memulai transaksi lokal. Tentukan hanya nama dan nilai kolom kunci primer pertama. |
|
primary_key (required) |
|
Kunci primer lengkap yang digunakan untuk membaca atau menulis baris dalam transaksi. Tentukan semua kolom kunci primer. Untuk operasi tulis, nilai kunci partisi harus sesuai dengan |
|
transaction_id (required) |
|
ID transaksi lokal yang dikembalikan oleh |
Batasan
Transaksi lokal tidak kompatibel dengan kolom kunci utama auto-increment.
Transaksi lokal menggunakan kunci pesimistis. Selama transaksi berlangsung, kunci tulis diterapkan pada data untuk nilai kunci partisi tersebut, dan hanya operasi tulis yang menyertakan ID transaksi yang dapat berhasil.
Masa aktif transaksi maksimal adalah 60 detik. Jika jeda antara dua operasi berturut-turut melebihi 60 detik, transaksi akan kedaluwarsa dan server akan membatalkannya.
Satu ID transaksi hanya dapat digunakan oleh satu permintaan dalam satu waktu. Permintaan konkuren yang menggunakan ID yang sama akan gagal semuanya.
Setiap operasi tulis dalam transaksi harus menggunakan nilai kunci partisi yang sama dengan yang digunakan saat memulai transaksi. Operasi baca tidak memiliki batasan ini.
Satu transaksi dapat menulis hingga 4 MB data.
Jika penulisan kolom atribut tidak menentukan versi data, server akan menghasilkan versi tersebut saat penulisan, bukan saat komit.
Ketika
BatchWriteRowRequestmenyertakan ID transaksi, semua baris harus ditujukan ke tabel tempat transaksi dimulai.Jika transaksi tidak mengandung operasi tulis, komit dan batalkan memiliki efek yang sama dan keduanya akan melepaskan transaksi.
Operasi baca atau tulis yang gagal namun menyertakan ID transaksi tidak mengakhiri transaksi. Ulangi permintaan tersebut atau batalkan transaksi secara eksplisit.
Contoh
Baca baris dalam transaksi
Contoh berikut membaca satu baris dalam transaksi lokal. Untuk transaksi read-only, komit dan batalkan memiliki efek yang sama.
table_name = "example_table"
partition_key = [("partition", "device")]
transaction_id = client.start_local_transaction(table_name, partition_key)
primary_key = [("partition", "device"), ("id", 1)]
consumed, return_row, next_token = client.get_row(
table_name,
primary_key,
transaction_id=transaction_id,
)
print(return_row.primary_key, return_row.attribute_columns)
client.commit_transaction(transaction_id)
Tulis beberapa baris sekaligus dalam transaksi
Contoh berikut memanggil set_transaction_id untuk menyertakan ID transaksi dalam permintaan batch. Nilai kunci partisi setiap baris harus sesuai dengan nilai yang digunakan saat memulai transaksi.
table_name = "example_table"
partition_key = [("partition", "device")]
transaction_id = client.start_local_transaction(table_name, partition_key)
condition = Condition(RowExistenceExpectation.IGNORE)
row_items = [
PutRowItem(Row([("partition", "device"), ("id", 2)], [("status", "online")]), condition),
PutRowItem(Row([("partition", "device"), ("id", 3)], [("status", "offline")]), condition),
]
request = BatchWriteRowRequest()
request.add(TableInBatchWriteRowItem(table_name, row_items))
request.set_transaction_id(transaction_id)
response = client.batch_write_row(request)
if response.is_all_succeed():
client.commit_transaction(transaction_id)
else:
client.abort_transaction(transaction_id)