Gunakan fitur pembaruan bersyarat untuk memperbarui data dalam tabel hanya jika kondisi yang ditentukan terpenuhi. Jika kondisi tidak terpenuhi, pembaruan akan gagal.
Prasyarat
Sebuah instance OTSClient telah diinisialisasi. Untuk informasi lebih lanjut, lihat Inisialisasi instance OTSClient.
Tabel data telah dibuat dan data telah ditulis ke tabel tersebut. Untuk informasi lebih lanjut, lihat Buat tabel data dan Tulis data.
Catatan penggunaan
Saat Anda memanggil operasi PutRow, UpdateRow, DeleteRow, atau BatchWriteRow untuk memperbarui data dalam tabel, Anda dapat menentukan kondisi keberadaan baris dan kondisi berbasis kolom untuk melakukan pembaruan bersyarat. Data diperbarui hanya jika kondisi terpenuhi.
Pembaruan bersyarat dapat dilakukan berdasarkan kondisi keberadaan baris dan kondisi berbasis kolom.
Kondisi keberadaan baris yang didukung meliputi: IGNORE, EXPECT_EXIST, dan EXPECT_NOT_EXIST.
Saat memperbarui tabel, Tablestore pertama-tama memeriksa apakah kondisi keberadaan baris terpenuhi. Jika kondisi tidak terpenuhi, pembaruan gagal dan kesalahan dilaporkan.
Kondisi berbasis kolom mencakup RelationalCondition dan CompositeCondition, yang digunakan untuk menentukan apakah kondisi terpenuhi berdasarkan nilai satu atau beberapa kolom.
Kondisi berbasis kolom mendukung operator relasional berikut: =, !=, >, >=, <, dan <=. Kondisi ini juga mendukung operator logika seperti NOT, AND, dan OR. Anda dapat menentukan hingga 10 kondisi berbasis kolom untuk pembaruan bersyarat.
RelationalCondition memungkinkan Anda membandingkan kolom dengan konstanta. Perbandingan antara dua kolom atau dua konstanta tidak didukung.
CompositeCondition terdiri dari beberapa RelationalConditions atau CompositeConditions. Anda harus menentukan hubungan logis antar subkondisi.
Anda dapat melakukan pembaruan bersyarat untuk mengimplementasikan kunci optimis. Saat memperbarui baris, Anda perlu mendapatkan nilai kolom tertentu dan menetapkan kondisi pembaruan berdasarkan nilai tersebut. Sebagai contoh, untuk memperbarui nilai Kolom A dalam baris menjadi 2, Anda harus terlebih dahulu mendapatkan nilai Kolom A. Dalam contoh ini, nilai yang diperoleh adalah 1. Kemudian, Anda menetapkan bahwa baris hanya dapat diperbarui jika nilai Kolom A adalah 1. Jika kondisi tersebut terpenuhi, pembaruan berhasil. Namun, jika baris telah diperbarui oleh klien lain, pembaruan akan gagal.
Parameter
Parameter | Deskripsi |
RowExistenceExpectation | Saat Anda memperbarui tabel data, Tablestore pertama-tama memeriksa apakah kondisi keberadaan baris terpenuhi. Jika kondisi keberadaan baris tidak terpenuhi, pembaruan gagal dan kesalahan dilaporkan. Kondisi keberadaan baris berikut didukung: IGNORE, EXPECT_EXIST, dan EXPECT_NOT_EXIST.
|
ColumnName | Nama kolom. |
ColumnValue | Nilai yang akan dibandingkan dengan kolom. |
Operator | Operator relasional yang digunakan untuk membandingkan nilai. Untuk informasi lebih lanjut, lihat ComparatorType. Operator relasional berikut didukung: =, !=, >, >=, <, dan <=. |
LogicOperator | Operator logika yang digunakan untuk menggabungkan beberapa kondisi. Untuk informasi lebih lanjut, lihat LogicalOperator. Operator relasional berikut didukung: NOT, AND, dan OR. Jumlah subkondisi yang diperlukan bervariasi berdasarkan operator logika.
|
PassIfMissing | Menentukan apakah pemeriksaan bersyarat dilewati jika kolom tidak ada dalam baris. Nilai parameter ini adalah tipe data Boolean. Nilai defaultnya adalah true, yang menunjukkan bahwa jika kolom tidak ada dalam baris, pemeriksaan bersyarat dilewati dan baris memenuhi kondisi pembaruan. Jika parameter PassIfMissing disetel ke false, pemeriksaan bersyarat gagal ketika kolom tidak ada dalam baris. |
LatestVersionsOnly | Menentukan apakah hanya menggunakan nilai versi terbaru saat kolom memiliki beberapa versi nilai. Nilai parameter ini adalah tipe data Boolean. Nilai defaultnya adalah true, yang menunjukkan bahwa jika kolom memiliki beberapa versi data, hanya nilai versi terbaru yang digunakan untuk perbandingan. Jika parameter LatestVersionsOnly disetel ke false, nilai kolom dari semua versi digunakan untuk perbandingan jika kolom memiliki beberapa versi data. Dalam hal ini, pemeriksaan bersyarat dilewati ketika salah satu versi nilai memenuhi kondisi. |
Contoh
Berikut adalah kode sampel yang menunjukkan cara memperbarui data berdasarkan kondisi berbasis kolom. Jika nilai kolom col0 sama dengan 5, data diperbarui. Jika tidak, pembaruan gagal.
// Tentukan primary key dari baris. Primary key harus sama dengan primary key yang ditentukan dalam TableMeta saat tabel dibuat.
PrimaryKey primaryKey = new PrimaryKey();
primaryKey.Add("pk0", new ColumnValue(0));
primaryKey.Add("pk1", new ColumnValue("abc"));
// Tentukan kolom atribut dari baris.
AttributeColumns attribute = new AttributeColumns();
attribute.Add("col0", new ColumnValue(0));
attribute.Add("col1", new ColumnValue("a"));
attribute.Add("col2", new ColumnValue(true));
PutRowRequest request = new PutRowRequest(tableName, new Condition(RowExistenceExpectation.IGNORE), primaryKey, attribute);
// Panggil operasi PutRow saat kondisi lain tidak dikonfigurasikan. Operasi diharapkan berhasil.
try
{
otsClient.PutRow(request);
Console.WriteLine("Put row berhasil.");
} catch (Exception ex)
{
Console.WriteLine("Put row gagal. error:{0}", ex.Message);
}
// Jika nilai kolom col0 tidak sama dengan 5, panggil operasi PutRow lagi untuk menimpa nilai asli. Operasi diharapkan berhasil.
try
{
request.Condition.ColumnCondition = new RelationalCondition("col0",
CompareOperator.NOT_EQUAL,
new ColumnValue(5));
otsClient.PutRow(request);
Console.WriteLine("Put row berhasil.");
} catch (Exception ex)
{
Console.WriteLine("Put row gagal. error:{0}", ex.Message);
}
// Jika nilai kolom col0 sama dengan 5, panggil operasi PutRow lagi untuk menimpa nilai asli. Operasi diharapkan berhasil.
try
{
// Tambahkan kondisi baru bahwa nilai kolom col0 sama dengan 5.
request.Condition.ColumnCondition = new RelationalCondition("col0",
CompareOperator.EQUAL,
new ColumnValue(5));
otsClient.PutRow(request);
Console.WriteLine("Put row berhasil.");
}
catch (OTSServerException)
{
// OTSServerException dikembalikan karena kondisi tidak terpenuhi.
Console.WriteLine("Put row gagal karena pemeriksaan kondisi gagal. tetapi diharapkan");
}
catch (Exception ex)
{
Console.WriteLine("Put row gagal. error:{0}", ex.Message);
}