只有當資料滿足列判斷條件時,才能對資料表中的資料進行更新;當資料不滿足列判斷條件時,資料更新失敗。
前提條件
已初始化Client,具體操作,請參見初始化OTSClient。
使用方法
在通過PutRow、UpdateRow、DeleteRow和BatchWriteRow介面動作表中資料時,可以使用條件更新檢查行存在性條件和列條件,只有滿足條件時才能成功更新。
條件更新包括行存在性條件和列條件。
行存在性條件:包括IGNORE、EXPECT_EXIST和EXPECT_NOT_EXIST,分別代表忽略、期望存在和期望不存在。
對資料表變更操作時,系統會先檢查行存在性條件,如果不滿足行存在性條件,則更改失敗並給使用者報錯。
列條件:包括RelationalCondition和CompositeCondition,是基於某一列或者某些列的列值進行條件判斷。
列條件中支援使用關係運算(=、!=、>、>=、<、<=)和邏輯運算(NOT、AND、OR),單個更新條件中最多支援設定10個列條件。
RelationalCondition支援一列(可以是主鍵列)和一個常量比較。不支援兩列或者兩個常量相比較。
CompositeCondition的內節點為邏輯運算,子條件可以是RelationalCondition或CompositeCondition。
條件更新可以實現樂觀鎖功能,即在更新某行時,先擷取某列的值,假設為列A,值為1,然後設定條件列A=1,更新行使列A=2。如果更新失敗,表示有其他用戶端已成功更新該行。
參數
參數 | 說明 |
RowExistenceExpectation | 對資料表變更操作時,系統會先檢查行存在性條件,如果不滿足行存在性條件,則更改失敗並給使用者報錯。 行存在性條件包括IGNORE、EXPECT_EXIST和EXPECT_NOT_EXIST。
|
ColumnName | 列的名稱。 |
ColumnValue | 列的對比值。 |
Operator | 對列值進行比較的關係運算子,類型詳情請參見ComparatorType。 關係運算子包括EQUAL(=)、NOT_EQUAL(!=)、GREATER_THAN(>)、GREATER_THAN(>=)、LESS_THAN(<)和LESS_EQUAL(<=)。 |
LogicOperator | 對多個條件進行組合的邏輯運算子,類型詳情請參見LogicalOperator。 邏輯運算子包括NOT、AND和OR。 邏輯運算子不同可以添加的子條件個數不同。
|
PassIfMissing | 當列在某行中不存在時,條件檢查是否通過。類型為bool值,預設值為true,表示如果列在某行中不存在時,則條件檢查通過,該行滿足更新條件。 當設定PassIfMissing為false時,如果列在某行中不存在時,則條件檢查不通過,該行不滿足更新條件。 |
LatestVersionsOnly | 當列存在多個版本的資料時,是否只使用最新版本的值做比較。類型為bool值,預設值為true,表示如果列存在多個版本的資料時,則只使用該列最新版本的值進行比較。 當設定LatestVersionsOnly為false時,如果列存在多個版本的資料時,則會使用該列的所有版本的值進行比較,此時只要有一個版本的值滿足條件,就條件檢查通過,該行滿足更新條件。 |
樣本
以下樣本用於更新滿足指定條件的資料。當col0列的值不等於5時更新資料成功,當col0列的值等於5時更新資料失敗。
//定義行的主鍵,必須與建立表時的TableMeta中定義的一致。
PrimaryKey primaryKey = new PrimaryKey();
primaryKey.Add("pk0", new ColumnValue(0));
primaryKey.Add("pk1", new ColumnValue("abc"));
//定義行的屬性列。
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);
//不帶condition時putrow,預期更新成功。
try
{
otsClient.PutRow(request);
Console.WriteLine("Put row succeeded.");
} catch (Exception ex)
{
Console.WriteLine("Put row failed. error:{0}", ex.Message);
}
//當col0列的值不等於5,將再次putrow,覆蓋原有值,預期更新成功。
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);
}
//當col0列的值等於5,將再次putrow,覆蓋原有值,預期更新失敗。
try
{
//新增col0列的值等於5條件。
request.Condition.ColumnCondition = new RelationalCondition("col0",
CompareOperator.EQUAL,
new ColumnValue(5));
otsClient.PutRow(request);
Console.WriteLine("Put row succeeded.");
}
catch (OTSServerException)
{
//由於條件不滿足,拋出OTSServerException。
Console.WriteLine("Put row failed because condition check failed. but expected");
}
catch (Exception ex)
{
Console.WriteLine("Put row failed. error:{0}", ex.Message);
}