다음을 통해 공유


조건이 있는 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

플래그를 사용하지 않는 것과 비교하여 전체 행 삽입에서 성능이 저하될 수 있습니다.

참고 항목

다중 지역 쓰기 시나리오에는 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 내에서 경량 트랜잭션이 작동하는 방법에 대해 알아보았습니다. 다음 문서로 진행할 수 있습니다.