3.1.14.2. BEGIN

启动一个事务块。

3.1.14.2.1. 语法

BEGIN [WORK | TRANSACTION] [transaction_mode]
      [READ ONLY | READ WRITE]

transaction_mode 可以是下面的一个值:

ISOLATION LEVEL | {SERIALIZABLE | READ COMMITTED | READ UNCOMMITTED}

3.1.14.2.2. 描述

BEGIN 启动一个事务块,所有在 BEGIN 语句之道 COMMIT 或 ROLLBACK 的语句之间的 SQL 命令将会被当做一个单独的事务运行。默认情况下(不使用 BEGIN),HashData 数据仓库 工作在自动提交模式,每条语句将会自动启动一个事务快,并执行该语句,在语句执行后,自动执行事务提交命令(如果执行失败,将会自动执行回滚)。

由于启动和提交事务需要额外的 CPU 和 磁盘资源,因此在同一个事务块中运行多个语句的速度更快。在同一个事务中运行多个语句也能更好的保证多个修改后的数据一致性:其他会话的操作不会观察到还没有完成的更新操作导致道数据中间状态。

如果指定了隔离级别或读写模式,新事务将会具有设置的特性,此效果与执行 SET TRANSACTION 一致。

3.1.14.2.3. 参数

WORK TRANSACTION

可选的关键字,无任何效果。

SERIALIZABLE READ COMMITTED READ UNCOMMITTED

SQL 标准定了四个事务隔离级别:READ COMMITTED,READ UNCOMMITTED,SERIALIZABLE 和 REPEATABLE READ。默认行为是一条命令只能看到在它开始运行时已经提交的结果(READ COMMITTED)。在 HashData 数据仓库 中,READ UNCOMMITTED 和 READ COMMITTED 行为相同。虽然不支持 REPEATABLE READ,但是可以使用更严格的 SERIALIZABLE 模式。SERIALIZABLE 是事务隔离级别中最严格的。在此模式下,事务的执行将会模拟串行化事务执行的效果,类似于事务是一个接着一个运行,而并不是并发执行。应用在使用 SERIALIZABLE 隔离级别时,需要处理由于串行化失败后重新执行事务的工作。

READ WRITE READ ONLY

决定事务是读写模式还是只读模式。默认模式为读写模式。当一个事务是只读模式,下面的 SQL 命令将会被禁用:访问非临时表的 INSERT,UPDATE,DELETE 和 COPY FROM命令; 所有的 CREATE,ALTER,和 DROP 命令;GRANT,REVOKE,TRUNCATE 命令;在 EXPLAIN ANALYZE 和 EXECUTE 中使用了前面提到的过的命令。

3.1.14.2.4. 注意

START TRANSACTION 和 BEGIN 命令功能相同。

使用 COMMIT 或 ROLLBACK 来结束一个事务块。

在启动的事务块内部执行 BEGIN 没有任何副作用,但是系统会发出一条警告信息。事务的状态不会受到任何影响。要在事务块中使用嵌套事务,使用保存点功能( 参考 SAVEPOINT)。

3.1.14.2.5. 示例

要启动一个事务:

BEGIN;

启动一个可串行化隔离级别的事务:

BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;

3.1.14.2.6. 兼容性

BEGIN 是 PostgreSQL 和 Greenplum Database 的扩展命令。它等效于 SQL 标准命令 START TRANSACTION。

然而,BEGIN 关键词在嵌入式 SQL 中具有其它含义。在您迁移数据库应用时,请小心留意事务语义。

3.1.14.2.7. 相关命令

COMMIT, ROLLBACK, START TRANSACTION, SAVEPOINT