- カテゴリ:
BEGIN¶
現在のセッションでトランザクションを開始します。
START TRANSACTION は BEGIN の同義語です。
- こちらもご参照ください:
構文¶
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;
自律スコープトランザクションとストアドプロシージャ を使用している場合、ルールはより複雑になる可能性があります。
例¶
トランザクションを開始します。
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 | +-------------------------------+