BEGIN¶
在当前会话中开始事务。
START TRANSACTION 与 BEGIN 同义。
语法¶
BEGIN [ { WORK | TRANSACTION } ] [ NAME <name> ]
START TRANSACTION [ NAME <name> ]
参数¶
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;
如果使用 :ref:` 自治作用域事务和存储过程 <label-transactions__stored_procedures_and_transactions>`,则规则可能会更加复杂。
示例¶
开始一个事务:
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 | +-----------------------+
与前面的示例相同,但使用 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 | +-----------------------+