Fitur pembaruan bersyarat memungkinkan Anda memperbarui data dalam tabel hanya jika kondisi tertentu terpenuhi. Jika kondisi tidak terpenuhi, pembaruan akan gagal.
Prasyarat
-
Instans OTSClient telah diinisialisasi. Untuk informasi selengkapnya, lihat Inisialisasi instans OTSClient.
-
Tabel data telah dibuat dan data telah ditulis ke dalamnya. Untuk informasi selengkapnya, lihat Buat tabel data dan Tulis data.
Catatan penggunaan
Saat memanggil operasi PutRow, UpdateRow, DeleteRow, atau BatchWriteRow untuk memperbarui data dalam tabel, Anda dapat menentukan kondisi keberadaan baris dan kondisi berbasis kolom guna menerapkan pembaruan bersyarat. Data hanya diperbarui jika semua kondisi terpenuhi.
Pembaruan bersyarat didasarkan pada dua jenis kondisi: kondisi keberadaan baris dan kondisi berbasis kolom.
-
Kondisi keberadaan baris yang didukung meliputi: IGNORE, EXPECT_EXIST, dan EXPECT_NOT_EXIST.
Saat memperbarui tabel, Tablestore terlebih dahulu memverifikasi apakah kondisi keberadaan baris terpenuhi. Jika tidak, pembaruan gagal dan kesalahan dilaporkan.
-
Kondisi berbasis kolom mencakup RelationalCondition dan CompositeCondition, yang digunakan untuk mengevaluasi apakah nilai satu atau beberapa kolom memenuhi kriteria tertentu.
Kondisi berbasis kolom mendukung operator relasional berikut: =, !=, >, >=, <, dan <=. Selain itu, kondisi ini juga mendukung operator logika: NOT, AND, dan OR. Anda dapat menentukan hingga 10 kondisi berbasis kolom dalam satu pembaruan bersyarat.
-
RelationalCondition memungkinkan perbandingan antara suatu kolom dan konstanta. Perbandingan antar dua kolom atau antar dua konstanta tidak didukung.
-
CompositeCondition terdiri dari beberapa RelationalCondition atau CompositeCondition lainnya, dengan hubungan logika yang ditentukan di antara subkondisi tersebut.
-
Anda dapat melakukan pembaruan bersyarat untuk menerapkan kunci optimis (optimistic locking). Saat memperbarui suatu baris, Anda harus mengambil nilai kolom tertentu dan menentukan kondisi pembaruan baris berdasarkan nilai kolom tersebut. Misalnya, saat memperbarui nilai Kolom A dalam suatu baris menjadi 2, Anda harus mengambil nilai Kolom A terlebih dahulu. Dalam contoh ini, nilai yang diambil adalah 1. Lalu, Anda harus menentukan bahwa baris hanya dapat diperbarui jika nilai Kolom A adalah 1. Jika kondisi yang ditentukan terpenuhi, pembaruan berhasil. Jika baris tersebut telah diperbarui oleh client lain, pembaruan akan gagal.
Parameter
|
Parameter |
Deskripsi |
|
RowExistenceExpectation |
Saat Anda memperbarui tabel data, Tablestore terlebih dahulu memeriksa apakah kondisi keberadaan baris terpenuhi. Jika tidak terpenuhi, pembaruan gagal dan error dilaporkan. Kondisi keberadaan baris berikut ini 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 selengkapnya, lihat ComparatorType. Operator relasional berikut ini didukung: =, !=, >, >=, <, dan <=. |
|
LogicOperator |
Operator logika yang digunakan untuk menggabungkan beberapa kondisi. Untuk informasi selengkapnya, lihat LogicalOperator. Operator logika berikut ini didukung: NOT, AND, dan OR. Jumlah subkondisi yang diperlukan bervariasi tergantung pada operator logika.
|
|
PassIfMissing |
Menentukan apakah pemeriksaan kondisi dianggap lolos jika suatu kolom tidak ada dalam baris. Nilai parameter ini bertipe data Boolean. Nilai default-nya adalah true, yang berarti jika kolom tidak ada dalam baris, pemeriksaan kondisi dianggap lolos dan baris memenuhi syarat pembaruan. Jika parameter PassIfMissing diatur ke false, pemeriksaan kondisi gagal ketika kolom tidak ada dalam baris. |
|
LatestVersionsOnly |
Menentukan apakah hanya nilai versi terbaru yang digunakan saat kolom memiliki beberapa versi nilai. Nilai parameter ini bertipe data Boolean. Nilai default-nya adalah true, yang berarti jika kolom memiliki beberapa versi data, hanya nilai versi terbaru yang digunakan untuk perbandingan. Jika parameter LatestVersionsOnly diatur ke false, nilai semua versi kolom digunakan untuk perbandingan jika kolom memiliki beberapa versi data. Dalam hal ini, pemeriksaan kondisi dianggap lolos jika salah satu versi nilai memenuhi kondisi. |
Contoh
Kode contoh berikut menunjukkan cara memperbarui data berdasarkan kondisi berbasis kolom. Jika nilai kolom col0 sama dengan 5, data diperbarui; jika tidak, pembaruan gagal.
// Tentukan primary key 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 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 belum dikonfigurasi. Operasi ini diharapkan berhasil.
try
{
otsClient.PutRow(request);
Console.WriteLine("Put row succeeded.");
} catch (Exception ex)
{
Console.WriteLine("Put row failed. error:{0}", ex.Message);
}
// Jika nilai kolom col0 tidak sama dengan 5, panggil kembali operasi PutRow untuk menimpa nilai aslinya. Operasi ini diharapkan berhasil.
try
{
request.Condition.ColumnCondition = new RelationalCondition("col0",
CompareOperator.NOT_EQUAL,
new ColumnValue(5));
otsClient.PutRow(request);
Console.WriteLine("Put row succeeded.");
} catch (Exception ex)
{
Console.WriteLine("Put row failed. error:{0}", ex.Message);
}
// Jika nilai kolom col0 sama dengan 5, panggil kembali operasi PutRow untuk menimpa nilai aslinya. Operasi ini 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 succeeded.");
}
catch (OTSServerException)
{
// OTSServerException dikembalikan karena kondisi tidak terpenuhi.
Console.WriteLine("Put row failed because condition check failed. but expected");
}
catch (Exception ex)
{
Console.WriteLine("Put row failed. error:{0}", ex.Message);
}