BEGIN

在当前会话中开始事务。

START TRANSACTION 与 BEGIN 同义。

另请参阅:

COMMITROLLBACKSHOW TRANSACTIONSDESCRIBE TRANSACTION

语法

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

START TRANSACTION [ NAME <name> ]
Copy

参数

WORK | TRANSACTION

可选关键字,用于提供与其他数据库系统的兼容性。

NAME name

可选字符串,用于为事务分配名称。名称有助于识别事务,但不是必需的,也不需要唯一。

使用说明

  • 所有事务都有一个系统生成的内部 ID。事务 ID 是一个有符号的 64 位(长)整型。值的范围为 -9,223,372,036,854,775,808 (-2 63) 到 9,223,372,036,854,775,807 (2 63 - 1)。

  • 如果为事务指定名称,则需要 NAME 关键字。

  • 如果未指定名称,则为事务分配系统生成的名称。

  • 要完成事务,则必须显式执行 COMMIT 或 ROLLBACK 命令。在执行其中一个命令之前,事务将保持未结状态。

  • 在 SQL 语句查询显式事务中的流时,在事务开始时的流推进点(即时间戳)而非语句运行时查询流。此行为既与 DML 语句有关,也与 CREATE TABLE ...AS SELECT (CTAS) 语句(使用现有流中的行填充新表)有关。

  • 如果执行一行中的两个 BEGIN 语句(在同一 :ref:` 作用域 <label-scoped_transactions>` 内),则忽略第二个语句。例如,在以下代码中,第二个和第三个 BEGINs 不起作用;现有的未结事务继续进行。

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

    如果使用 :ref:` 自治作用域事务和存储过程 <label-transactions__stored_procedures_and_transactions>`,则规则可能会更加复杂。

示例

备注

这些示例不包括完成事务所需的命令。有关完整事务的示例,请参阅 COMMITROLLBACK

开始一个事务:

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         |
+-----------------------+
Copy

请注意系统为该事务分配的名称 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         |
+-----------------------+
Copy

与前面的示例相同,但使用 START TRANSACTION 代替 BEGIN:

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         |
+-----------------------+
Copy
语言: 中文