条件を使用した Azure Cosmos DB for Apache Cassandra の軽量トランザクション
適用対象: Cassandra
ほとんどの NoSQL データベース プラットフォームとしての Apache Cassandra は、リレーショナル データベースのように ACID トランザクションをサポートしていないため、整合性よりも可用性とパーティション トレランスが優先されます。 LWT で整合性レベルがどのように機能するかの詳細については、Azure Cosmos DB for Apache Cassandra の整合性レベルに関するページを参照してください。 Cassandra は、ACID に近似する軽量トランザクション (LWT) をサポートします。 データの挿入または更新を必要とする操作が一意である必要がある場合は、書き込み前に読み取りを実行するのに役立ちます。
Azure Cosmos DB for Apache Cassandra 内での LWT のサポート
Azure Cosmos DB for Apache Cassandra 内で LWT を使用するには、テーブルの作成レベルで次のフラグを設定することをお勧めします。
with cosmosdb_cell_level_timestamp=true and cosmosdb_cell_level_timestamp_tombstones=true and cosmosdb_cell_level_timetolive=true
フラグを使用しない場合に比べて、行全体の挿入のパフォーマンスが低下する可能性があります。
Note
LWT は、複数リージョン書き込みのシナリオではサポートされていません。
フラグが有効になっている LWT
CREATE KEYSPACE IF NOT EXISTS lwttesting WITH REPLICATION= {'class': 'org.apache.cassandra.locator.SimpleStrategy', 'replication_factor' : '1'};
CREATE TABLE IF NOT EXISTS lwttesting.users (
name text,
userID int,
address text,
phoneCode int,
vendorName text STATIC,
PRIMARY KEY ((name), userID)) with cosmosdb_cell_level_timestamp=true and cosmosdb_cell_level_timestamp_tombstones=true and cosmosdb_cell_level_timetolive=true;
次のクエリは TRUE を返します。
INSERT INTO lwttesting.users(name, userID, phoneCode, vendorName)
VALUES('Sara', 103, 832, 'vendor21') IF NOT EXISTS;
制限事項
フラグを有効にした場合、いくつかの既知の制限があります。
テーブルに行が挿入されている場合、静的行を挿入しようとすると FALSE が返されます。
INSERT INTO lwttesting.users (userID, vendorName) VALUES (104, 'staticVendor') IF NOT EXISTS;
上記のクエリは現時点では FALSE を返しますが、TRUE である必要があります。
TTL の期限が切れた後に別の行を挿入しようとすると、false が返されます。
CREATE TABLE IF NOT EXISTS lwttesting.customers ( customer text PRIMARY KEY, user text, entry timestamp) with cosmosdb_cell_level_timestamp=true and cosmosdb_cell_level_timestamp_tombstones=true and cosmosdb_cell_level_timetolive=true; INSERT INTO lwttesting.customers (customer, user, entry) VALUES ('vendor', 'Sara', '2023-10-10 15:00:00.000000+0000') IF NOT EXISTS USING TTL 30;
このクエリは TRUE を返します。 ただし、別の挿入を試行すると FALSE が返されます。
フラグが無効になっている LWT
フラグが有効になっていない場合、IF 条件と組み合わせた行の削除はサポートされません。
CREATE TABLE IF NOT EXISTS lwttesting.vendor_users (
name text,
userID int,
areaCode int,
vendor text STATIC,
PRIMARY KEY ((userID), name)
);
DELETE FROM lwttesting.vendor_users
WHERE userID =103 AND name = 'Sara'
IF areaCode = 832;
エラー メッセージ: 行全体の条件付き削除はサポートされていません。
フラグが有効または無効になっている LWT
静的および通常列の割り当てと条件の組み合わせを含む要求は、IF 条件ではサポートされていません。 両方の列が正規であるため、このクエリはエラー メッセージを返しません。
DELETE areaCode
FROM lwttesting.vendor_users
WHERE name= 'Sara'
AND userID = 103 IF areaCode = 832;
ただし、次のクエリはエラー メッセージ Conditions and assignments containing combination of Static and Regular columns are not supported.
を返します
DELETE areaCode
FROM lwttesting.vendor_users
WHERE name= 'Sara' AND userID = 103 IF vendor = 'vendor21';
次のステップ
このチュートリアルでは、Azure Cosmos DB for Apache Cassandra 内での軽量トランザクションの機能について説明しました。 次の記事に進むことができます。