0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Couchbase Server N1QL解説:ロールバック

Last updated at Posted at 2022-01-21

はじめに

ここでは、NoSQLドキュメント指向データベースCouchbase Serverの機能について解説しています。

Couchbase Serverには、トランザクション機能があります。

Couchbase Serverの存在意義、機能詳細、利用方法等については、拙著NoSQLドキュメント指向データベースCouchbase Serverファーストステップガイド(インプレスR&D刊)や、NoSQL/JSONデータベースCouchbase Server理解・活用へのロードマップにまとめてある記事をご参考ください。

トランザクション機能は、SDKのAPIコールとして利用する他、N1QLクエリとして、標準SQLと同じように利用することができます。ここではN1QLにおけるロールバックについて、具体的にステートメントのレベルで解説します。オーバービューについては、以下を参照してください。

ROLLBACK TRANSACTIONステートメント

ROLLBACK TRANSACTIONステートメントを使用すると、ACIDトランザクションをロールバックできます。トランザクション全体をロールバックすることも、前のセーブポイントにロールバックすることもできます。トランザクション全体をロールバックすると、トランザクション内のすべてのセーブポイントが削除されます。

このステートメントは、トランザクション内でのみ使用します(Couchbase Serverにおいて、トランザクションは、利用するかどうかの取捨選択が可能です)。

Query REST APIを使用している場合は、トランザクションIDを指定するためにtxidqueryパラメーターを設定する必要があります。

構文

rollback-transaction ::= ROLLBACK [ WORK | TRAN | TRANSACTION ] [ TO SAVEPOINT savepointname ]

image.png

WORKTRAN、およびTRANSACTIONキーワードは同義語です。これらのキーワードはオプションです。これらのキーワードのいずれか1つをステートメント中に含めるか、あるいは完全に省略することもできます。

セーブポイントへのロールバック

TO SAVEPOINT句を使用すると、指定したセーブポイントにロールバックできます。この句はオプションです。省略した場合、トランザクション全体がロールバックされます。

なお、SDKは、セーブポイントへの部分的なロールバック用のインターフェースを提供していません。

利用例

以下の内容は、トランザクションとロールバック、セーブポイントの概念を理解している方にとっては、特に新しい情報はないかもしれませんが、NoSQLデータベースであるCouchbase Serverでも、このようなことができる、というサンプルとして、何らかの参考になれば幸いです。

トランザクションをロールバックする

クエリ

BEGIN WORK;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
UPSERT INTO test VALUES("abc2", {"a":1});
SAVEPOINT s1; 
UPDATE test AS d SET d.b = 10 WHERE d.a > 0; 
SELECT d.*, META(d).id FROM test AS d WHERE d.a >= 0;
SAVEPOINT s2; 
UPDATE test AS d SET d.b = 10, d.c = "xyz" WHERE d.a > 0; 
SELECT d.*, META(d).id FROM test AS d WHERE d.a >= 0;
ROLLBACK TRAN TO SAVEPOINT s2;  
SELECT d.*, META(d).id FROM test AS d WHERE d.a >= 0;
ROLLBACK WORK;  
  • ① セーブポイントを設定します。
  • testキースペース内の指定されたドキュメントを更新して、bという2番目の属性を含めます。
  • ③ 2番目のセーブポイントを設定します。
  • testキースペース内の指定されたドキュメントを更新して、cという名前の3番目の属性を含めます。
  • ⑤ トランザクションを2番目のセーブポイントにロールバックします。
  • ⑥ トランザクション全体をロールバックします。

結果

[
  {
    "_sequence_num": 1,
    "_sequence_query": "BEGIN WORK;",
    "_sequence_query_status": "success",
    "_sequence_result": [
      {
        "txid": "d9dcc721-321b-42d2-825f-a623eefc28b6"
      }
    ]
  },
  {
    "_sequence_num": 2,
    "_sequence_query": "\nUPSERT INTO test VALUES(\"abc2\", {\"a\":1});",
    "_sequence_query_status": "success",
    "_sequence_result": {
      "results": []
    }
  },
  {
    "_sequence_num": 3,
    "_sequence_query": "\nSAVEPOINT s1;",
    "_sequence_query_status": "success",
    "_sequence_result": {
      "results": []
    }
  },
  {
    "_sequence_num": 4,
    "_sequence_query": "\nUPDATE test AS d SET d.b = 10 WHERE d.a > 0;",
    "_sequence_query_status": "success",
    "_sequence_result": {
      "results": []
    }
  },
  {
    "_sequence_num": 5,
    "_sequence_query": "\nSELECT d.*, META(d).id FROM test AS d WHERE d.a >= 0;",
    "_sequence_query_status": "success",
    "_sequence_result": [
      {
        "a": 1,
        "b": 10, 
        "id": "abc2"
      }
    ]
  },
  {
    "_sequence_num": 6,
    "_sequence_query": "\nSAVEPOINT s2;",
    "_sequence_query_status": "success",
    "_sequence_result": {
      "results": []
    }
  },
  {
    "_sequence_num": 7,
    "_sequence_query": "\nUPDATE test AS d SET d.b = 10, d.c = \"xyz\" WHERE d.a > 0;",
    "_sequence_query_status": "success",
    "_sequence_result": {
      "results": []
    }
  },
  {
    "_sequence_num": 8,
    "_sequence_query": "\nSELECT d.*, META(d).id FROM test AS d WHERE d.a >= 0;",
    "_sequence_query_status": "success",
    "_sequence_result": [
      {
        "a": 1,
        "b": 10,
        "c": "xyz", 
        "id": "abc2"
      }
    ]
  },
  {
    "_sequence_num": 9,
    "_sequence_query": "\nROLLBACK TRAN TO SAVEPOINT s2;",
    "_sequence_query_status": "success",
    "_sequence_result": {
      "results": []
    }
  },
  {
    "_sequence_num": 10,
    "_sequence_query": "\nSELECT d.*, META(d).id FROM test AS d WHERE d.a >= 0;",
    "_sequence_query_status": "success",
    "_sequence_result": [
      {
        "a": 1,
        "b": 10,  
        "id": "abc2"
      }
    ]
  },
  {
    "_sequence_num": 11,
    "_sequence_query": "\nROLLBACK WORK;",
    "_sequence_query_status": "success",
    "_sequence_result": {
      "results": []
    }
  }
]
  • ① 2番目のセーブポイントを設定する前に、ドキュメントには2つの属性があります:ab
  • ② 更新を第二のセーブポイントを設定し、実行した後、ドキュメントは3つの属性がありますabc
  • ③ 2番目のセーブポイントにロールバックした後、ドキュメントには再び2つの属性のみがあります:ab

結果確認

トランザクションのロールバックの結果を確認します。

クエリ

SELECT d.*, META(d).id FROM test AS d WHERE d.a >= 0;

結果

{
  "results": []
}

ロールバック後、該当するドキュメントは、存在しません。

関連情報

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?