Tablestore SDK for Python kullanarak tek bir bölüm anahtarı değeri için okuma ve yazma işlemlerini atomik bir işlemde gruplayın. Bu işlemin tüm yazmaları ya tamamen uygulanır ya da tamamen iptal edilir.
Ön koşullar
Tablestore SDK for Python öğesini yükleyin ve bir istemci başlatın.
-
Tablo için yerel işlemler etkinleştirilmiştir.
NotMevcut bir tablo için yerel işlemleri etkinleştirmek veya özelliğin etkin olup olmadığını kontrol etmek için bir destek talebi gönderin .
İşlev açıklaması
Yerel bir işlem tek bir bölüm anahtarı değeriyle sınırlıdır ve Read Committed yalıtım düzeyini kullanır. İşlem içindeki istekler aynı işlem kimliğini paylaşır. Yerel bir işlemi aşağıdaki şekilde kullanın:
İşlem kimliği almak için bölüm anahtarı değeriyle birlikte
start_local_transactionyöntemini çağırın.İşlem kapsamında
get_row,put_row,update_row,delete_row,batch_write_rowveyaget_rangeyöntemlerinden birini çağırın ve kimliğitransaction_idparametresi olarak geçirin.Tüm yazmaları uygulamak için
commit_transactionyöntemini veya tüm yazmaları iptal etmek içinabort_transactionyöntemini çağırın.
def start_local_transaction(self, table_name, key)
def commit_transaction(self, transaction_id)
def abort_transaction(self, transaction_id)
Aşağıdaki örnek, device bölüm anahtarı değeri için yerel bir işlem başlatır, bir satır yazar ve işlemi uygular.
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)
Parametreler
Yerel bir işlem aşağıdaki temel parametreleri içerir.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Sınırlamalar
Yerel işlemler otomatik artan birincil anahtar sütunlarıyla uyumlu değildir.
Yerel işlemler karamsar kilitleme (pessimistic locking) kullanır. İşlem sırasında, bölüm anahtarı değerine ait veriler üzerinde bir yazma kilidi tutulur ve yalnızca işlem kimliğini taşıyan yazmalar başarılı olur.
Bir işlemin maksimum ömrü 60 saniyedir. Arka arkaya gelen iki işlem arasında 60 saniyeden fazla süre varsa işlem zaman aşımına uğrar ve sunucu tarafından iptal edilir.
Bir işlem kimliği aynı anda yalnızca bir istek tarafından kullanılabilir. Kimliği paylaşan eşzamanlı isteklerin tümü başarısız olur.
İşlem içindeki her yazma, işlemi başlatan bölüm anahtarı değerini kullanmalıdır. Okuma işlemlerinde böyle bir kısıtlama yoktur.
Tek bir işlem en fazla 4 MB veri yazabilir.
Bir nitelik sütunu yazımı için veri sürümü belirtilmezse sunucu sürümü yazma sırasında oluşturur, uygulama sırasında değil.
Bir
BatchWriteRowRequestişlem kimliği taşıyorsa tüm satırlar işlemin başlatıldığı tabloyu hedeflemelidir.Bir işlem yazma içermiyorsa uygulama ve iptal aynı etkiye sahiptir ve her ikisi de işlemi serbest bırakır.
İşlem kimliği taşıyan başarısız bir okuma veya yazma işlemi sonlandırmaz. İsteği yeniden deneyin veya işlemi açıkça iptal edin.
Örnekler
İşlem sırasında bir satır okuma
Aşağıdaki örnek yerel bir işlem sırasında bir satır okur. Salt okunur işlemlerde uygulama ve iptal aynı etkiye sahiptir.
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)
İşlem sırasında toplu satır yazma
Aşağıdaki örnek, işlem kimliğini toplu bir isteğe dahil etmek için set_transaction_id yöntemini çağırır. Her satırın bölüm anahtarı değeri, işlemi başlatmak için kullanılan değerle eşleşmelidir.
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)