カテゴリ:

トランザクション

BEGIN

現在のセッションでトランザクションを開始します。

START TRANSACTION は BEGIN の同義語です。

こちらもご参照ください:

COMMITROLLBACKSHOW TRANSACTIONS

構文

BEGIN [ { WORK | TRANSACTION } ] [ NAME <name> ]

START TRANSACTION [ NAME <name> ]

パラメーター

WORK | TRANSACTION

他のデータベースシステムとの互換性を提供するオプションのキーワード。

NAME 名前

トランザクションに名前を割り当てるオプションの文字列。名前はトランザクションの識別に役立ちますが、必須ではなく、一意である必要もありません。

使用上の注意

  • すべてのトランザクションには、システムが生成した内部 ID があります。これは、トランザクションが開始されたときのタイムスタンプ(ミリ秒単位)です。

  • トランザクションの名前を指定する場合、 NAME キーワードが必要です。

  • 名前が指定されていない場合、システム生成の名前がトランザクションに割り当てられます。

  • トランザクションを完了するには、COMMIT または ROLLBACK コマンドを明示的に実行する必要があります。これらのコマンドのいずれかが実行されるまで、トランザクションは未処理の状態のままです。

  • SQL ステートメントが明示的なトランザクション内でストリームをクエリすると、ストリームはステートメントが実行されたときではなく、トランザクションが開始されたときのストリームアドバンスポイント(つまり、タイムスタンプ)でクエリされます。この動作は、DML ステートメントと、既存のストリームの行を新しいテーブルに取り込む CREATE TABLE ... AS SELECT (CTAS)ステートメントの両方に関係します。

  • If two BEGIN statements in a row are executed (within the same scope), the second one is ignored. For example, in the following code, the second and third BEGINs have no effect; the existing open transaction continues.

    begin;
    begin;    -- Ignored!
    insert into table1 ...;
    begin;    -- Ignored!
    insert into table2 ...;
    commit;
    

    自律スコープトランザクションとストアドプロシージャ を使用している場合、ルールはより複雑になる可能性があります。

注釈

これらの例には、トランザクションを完了するために必要なコマンドは含まれていません。完全なトランザクションの例については、 COMMIT または ROLLBACK をご参照ください。

トランザクションを開始します。

BEGIN;

SHOW TRANSACTIONS;

+---------------+--------+--------------+--------------------------------------+-------------------------------+---------+
|            id | user   |      session | name                                 | started_on                    | state   |
|---------------+--------+--------------+--------------------------------------+-------------------------------+---------|
| 1530042321085 | USER1  | 223347060798 | 56cb9163-77a3-4223-b3e0-aa24a20540a3 | 2018-06-26 12:45:21.085 -0700 | running |
+---------------+--------+--------------+--------------------------------------+-------------------------------+---------+

SELECT CURRENT_TRANSACTION()

+-----------------------+
| CURRENT_TRANSACTION() |
|-----------------------|
| 1530042321085         |
+-----------------------+

トランザクションにシステムが割り当てた名前 56cb9163-77a3-4223-b3e0-aa24a20540a3 を記録してください。

指定された名前でトランザクションを開始します。

BEGIN NAME T1;

SHOW TRANSACTIONS;

+---------------+--------+--------------+------+-------------------------------+---------+
|            id | user   |      session | name | started_on                    | state   |
|---------------+--------+--------------+------+-------------------------------+---------|
| 1530042377426 | USER1  | 223347060798 | T1   | 2018-06-26 12:46:17.426 -0700 | running |
+---------------+--------+--------------+------+-------------------------------+---------+

SELECT CURRENT_TRANSACTION();

+-----------------------+
| CURRENT_TRANSACTION() |
|-----------------------|
| 1530042377426         |
+-----------------------+

前の例と同じですが、BEGIN の代わりに START TRANSACTION を使用します。

START TRANSACTION NAME T2;

SHOW TRANSACTIONS;

+---------------+--------+--------------+------+-------------------------------+---------+
|            id | user   |      session | name | started_on                    | state   |
|---------------+--------+--------------+------+-------------------------------+---------|
| 1530042467963 | USER1  | 223347060798 | T2   | 2018-06-26 12:47:47.963 -0700 | running |
+---------------+--------+--------------+------+-------------------------------+---------+

SELECT CURRENT_TRANSACTION();

+-----------------------+
| CURRENT_TRANSACTION() |
|-----------------------|
| 1530042467963         |
+-----------------------+

3つの例すべてで、 CURRENT_TRANSACTION 関数はトランザクション ID (つまり、ミリ秒単位のトランザクションの開始時間)を返すことに注意してください。

ID/タイムスタンプで実行される関数は、適切なスケールを指定する必要があります。例:

SELECT CURRENT_TRANSACTION();

+-----------------------+
| CURRENT_TRANSACTION() |
|-----------------------|
| 1530042467963         |
+-----------------------+

SELECT TO_TIMESTAMP_LTZ(1530042467963, 3) AS transaction_timestamp;

+-------------------------------+
| TRANSACTION_TIMESTAMP         |
|-------------------------------|
| 2018-06-26 12:47:47.963 -0700 |
+-------------------------------+