BEGIN

Name

BEGIN  --  开始一个事务块

Synopsis

  
BEGIN [ WORK | TRANSACTION ]
  

输入

WORK
TRANSACTION

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

输出

BEGIN

这表明一个新的事务已经开始.

WARNING: BEGIN: already a transaction in progress

这表明该事务已经运行,当前事务不受影响.

描述

缺省时,PostgreSQL非链接模式(unchained mode) (在其他数据库系统里也称之为"自动提交("autocommit"))"。 换句话说, 每个用户语句都是在其自身的事务中运行并且在语句结束时隐含的调用一个提交 (commit)(如果执行成功则提交,否则调用一个回卷)。 BEGIN 以链接模式(chained mode)初始化一个用户事务, 也就是说所有 BEGIN 命令后的用户语句都将在一个事务里面执行直到一个明确的 COMMIT 或者 ROLLBACK, 在链接模式里执行的语句很明显地快得多, 因为事务开始/提交(start/commit)需要大量的CPU和磁盘活动。在一个 事务内部执行多条语句对于修改若干个相关的表的时候也是很有用的: 在所有相关的更新完成之前,其它客户端就不会看到中间的状态。

PostgreSQL 里缺省的事务隔离级别是 READ COMMITTED, 这时在事务内部的查询只看到在该查询执行之前提交的修改。 所以,如果你需要更严格的事务隔离,你必须在 BEGIN 后马上使用 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE。 (另外,你可以改变缺省的事务隔离级别;参阅 PostgreSQL 管理员手册 获取细节。) 在 SERIALIZABLE 模式里,查询将只能看到整个事务开始之前的修改。 (实际上是在一个可串行化事务内部第一个DML语句执行前的数据)。

事务有标准的 ACID (原子性,一致性,隔离性,持续性) (atomic,consistent,isolatable,and durable)属性。

注意

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

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

参考 LOCK 获取有关在事务内部锁定表的更多信息。

如果你把 autocommit 模式关掉,那么就不需要 BEGIN:任何 SQL 命令都自动开始一个事务。

用法

开始一个用户事务:

BEGIN WORK;
  

兼容性

SQL92

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

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

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

SQL92 还要求事务的缺省隔离级别是 SERIALIZABLE。