BEGIN

Name

BEGIN -- 开始一个事务块

Synopsis

  
BEGIN [ WORK | TRANSACTION ] [ transaction_mode [, ...] ]

这里的 transaction_mode 是下列之一:

    ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
    READ WRITE | READ ONLY

描述

BEGIN 初始化一个事务块, 也就是说所有 BEGIN 命令后的用户语句都将在一个事务里面执行直到给出一个明确的 COMMIT 或者 ROLLBACK。 缺省时,(没有 BEGIN),PostgreSQL"autocommit" 模式执行事务,也就是说,每个语句在其自身的事务中执行, 并且在语句结束的时候隐含地执行一个提交(如果执行成功,否则执行回滚)。

在事务块里执行的语句很明显地快得多, 因为事务开始/提交(start/commit)需要大量的CPU和磁盘活动。 在一个 事务内部执行多条语句对于修改若干个相关的表的时候也是很有用的: 在所有相关的更新完成之前,其它会话看不到中间的状态。

如果声明了隔离级别或者读/写模式,那么新事务将具有那些特征。就像执行了 SET TRANSACTION 一样。

参数

WORK
TRANSACTION

可选关键字。没什么作用。

参考 SET TRANSACTION 获取这个语句的其它参数的含义。

注意

START TRANSACTION 有着和 BEGIN 一样的功能。

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

在一个现有事务块内部发出一个 BEGIN 将产生一个警告信息。 事务的状态将不会被影响。要想在一个事务块里嵌套事务,请使用保存点(savepoint) (参阅 SAVEPOINT)。

出于向下兼容考虑,在随后的 transaction_modes 之间的逗号可以忽略。

例子

开始一个用户事务:

BEGIN;

兼容性

BEGINPostgreSQL 语言的扩展。 在 SQL92 中没有明确的 BEGIN 的定义;事务初始化总是隐含的而且使用一个 COMMIT 或者 ROLLBACK 语句终止。

许多关系型数据库为了方便提供一个自动提交(autocommit)特性。

顺便说一句,BEGIN 关键字在嵌入 SQL 里用于不同的目的。 我们建议你在移植数据库应用时仔细检查事务的语意。

又见

COMMIT, ROLLBACK, START TRANSACTION, SAVEPOINT