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.
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.
nullJika Anda tidak mengaktifkan fitur transaksi lokal saat membuat tabel data dan ingin menggunakannya setelah pembuatan tabel, ajukan tiket.
Prosedur
Panggil operasi StartLocalTransaction untuk membuat transaksi lokal berdasarkan nilai kunci partisi tertentu dan peroleh 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.
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 pesimistik 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 membatalkannya karena waktu habis.
Meskipun kesalahan timeout terjadi, transaksi mungkin tetap dibuat di server Tablestore. Dalam hal ini, Anda dapat mengirim ulang permintaan pembuatan transaksi setelah transaksi sebelumnya habis waktu.
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. Permintaan lain yang menggunakan ID transaksi lokal yang sama akan gagal selama transaksi sedang digunakan.
Interval maksimum antara dua operasi baca atau tulis berturut-turut dalam transaksi lokal adalah 60 detik.
Jika tidak ada operasi baca atau tulis yang dilakukan selama lebih dari 60 detik, server Tablestore akan membatalkan transaksi karena waktu habis.
Maksimum 4 MB data dapat ditulis ke setiap transaksi. Volume data dihitung dengan cara yang sama seperti permintaan tulis biasa.
Jika nomor versi untuk sel tidak ditentukan, server Tablestore secara otomatis menetapkannya ketika sel 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 nilai kunci partisi berdasarkan mana transaksi dibuat. Hanya permintaan tulis yang berisi ID transaksi lokal dan dimulai dalam transaksi lokal yang dapat berhasil. Data dalam transaksi lokal dibuka kuncinya jika transaksi dikonfirmasi, dibatalkan, atau 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 membatalkan transaksi.
Parameter
Parameter | Diperlukan | Deskripsi |
NamaTabel | Ya | Nama tabel data. |
KunciUtama | Ya | Kunci utama tabel data.
|
IDTransaksi | Ya | ID transaksi lokal yang secara unik mengidentifikasi transaksi lokal. Anda harus menentukan ID transaksi lokal saat 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 penulisan berhasil, konfirmasikan transaksi; jika tidak, batalkan transaksi.
func transactionPutRow(client *tablestore.TableStoreClient, tableName string) {
// Tentukan nilai kunci partisi untuk transaksi lokal. Kunci partisi adalah kolom kunci utama pertama.
transPk := new(tablestore.PrimaryKey)
transPk.AddPrimaryKeyColumn("pk1", "pk1value")
trans := &tablestore.StartLocalTransactionRequest{
TableName: tableName,
PrimaryKey: transPk,
}
response, err := client.StartLocalTransaction(trans)
if err != nil {
fmt.Println("gagal membuat transaksi", err)
return
}
// Peroleh ID transaksi lokal.
transId := response.TransactionId
putPk := new(tablestore.PrimaryKey)
putPk.AddPrimaryKeyColumn("pk1", "pk1value")
putPk.AddPrimaryKeyColumn("pk2", int64(4))
putRowChange := &tablestore.PutRowChange{
TableName: tableName,
PrimaryKey: putPk,
}
putRowChange.AddColumn("col1", "col1data1")
putRowChange.AddColumn("col2", int64(3))
putRowChange.AddColumn("col3", []byte("test"))
putRowChange.SetCondition(tablestore.RowExistenceExpectation_IGNORE)
// Tentukan ID transaksi lokal, yang dapat diperoleh menggunakan StartLocalTransactionResponse.TransactionId.
putRowChange.TransactionId = transId
putRowRequest := &tablestore.PutRowRequest{
PutRowChange: putRowChange,
}
_, err = client.PutRow(putRowRequest)
if err != nil {
// 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.
fmt.Println("putrow gagal dengan kesalahan:", err)
request := &tablestore.AbortTransactionRequest{
TransactionId: transId,
}
abortResponse, err := client.AbortTransaction(request)
if err != nil {
fmt.Println("gagal membatalkan transaksi dengan kesalahan:", err)
} else {
fmt.Println("pembatalan transaksi selesai. RequestId adalah", abortResponse.RequestId)
}
} else {
// Jika satu baris data ditulis dalam transaksi lokal, konfirmasikan 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.
fmt.Println("putrow selesai")
request := &tablestore.CommitTransactionRequest{
TransactionId: transId,
}
commitResponse, err := client.CommitTransaction(request)
if err != nil {
fmt.Println("gagal mengonfirmasi transaksi dengan kesalahan:", err)
} else {
fmt.Println("konfirmasi transaksi selesai. RequestId adalah", commitResponse.RequestId)
}
}
}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:
func transactionGetRow(client *tablestore.TableStoreClient, tableName string) {
// Tentukan nilai kunci partisi untuk transaksi lokal. Kunci partisi adalah kolom kunci utama pertama.
transPk := new(tablestore.PrimaryKey)
transPk.AddPrimaryKeyColumn("pk1", "pk1value")
trans := &tablestore.StartLocalTransactionRequest{
TableName: tableName,
PrimaryKey: transPk,
}
response, err := client.StartLocalTransaction(trans)
if err != nil {
fmt.Println("gagal membuat transaksi", err)
return
}
// Peroleh ID transaksi lokal.
transId := response.TransactionId
// Baca data.
getRowPk := new(tablestore.PrimaryKey)
getRowPk.AddPrimaryKeyColumn("pk1", "pk1value")
getRowPk.AddPrimaryKeyColumn("pk2", int64(18))
criteria := &tablestore.SingleRowQueryCriteria{
PrimaryKey: getRowPk,
TableName: tableName,
// Baca versi terbaru data.
MaxVersion: 1,
// Tentukan ID transaksi lokal.
TransactionId: transId,
}
getRowRequest := &tablestore.GetRowRequest{
SingleRowQueryCriteria: criteria,
}
getResp, err := client.GetRow(getRowRequest)
if err != nil {
fmt.Println("getrow gagal dengan kesalahan:", err)
} else {
fmt.Println("hasil mendapatkan baris col0 adalah ", getResp.Columns[0].ColumnName, getResp.Columns[0].Value)
}
// Konfirmasi atau batalkan transaksi lokal. Mengonfirmasi dan membatalkan transaksi lokal memiliki efek yang sama pada operasi baca.
// Konfirmasi transaksi lokal untuk memungkinkan semua modifikasi data dalam transaksi lokal berlaku.
request := &tablestore.CommitTransactionRequest{
TransactionId: transId,
}
commitResponse, err := client.CommitTransaction(request)
if err != nil {
fmt.Println("gagal mengonfirmasi transaksi dengan kesalahan:", err)
} else {
fmt.Println("konfirmasi transaksi selesai. RequestId adalah", commitResponse.RequestId)
}
// Batalkan transaksi lokal. Dalam hal ini, semua modifikasi data dalam transaksi lokal tidak berlaku untuk data dalam tabel data.
//request := &tablestore.AbortTransactionRequest{
// TransactionId: transId,
//}
//abortResponse, err := client.AbortTransaction(request)
//if err != nil {
// fmt.Println("gagal membatalkan transaksi dengan kesalahan:", err)
//} else {
// fmt.Println("pembatalan transaksi selesai. RequestId adalah", abortResponse.RequestId)
//}
}Referensi
Untuk menulis beberapa baris data sekaligus atau membaca data dengan nilai kunci utama dalam rentang tertentu, buat transaksi lokal. Lihat kode sampel dalam topik Menulis data atau Membaca data untuk memulai permintaan yang mencakup ID transaksi lokal.