BEGIN

名称

BEGIN — 以链的模式开始一个事务

语法

  
BEGIN [ WORK | TRANSACTION ]

输入

WORK, TRANSACTION
可选关键字。它们没有作用。

输出

BEGIN
这表明一个新的事务已经开始.
NOTICE: BEGIN: already a transaction in progress
这表明该事务已经运行,当前事务没有被影响.

描述

缺省时,Postgres非链接模式unchained mode)执行一个事务(在其他数据库系统里也称之为“自动提交”("autocommit"))。换句话说,每个用户语句都是在其自身的事务中运行并且在语句结束时隐含的调用一个提交(commit)(如果执行成功则提交,否则调用一个回卷)。 BEGIN 以链接模式(chained mode)初始化一个用户事务,也就是说所有 BEGIN 命令后的用户语句都将在一个事务里面执行直到一个显式的 COMMITROLLBACK,或执行退出。在链接模式里执行的语句很明显地快得多,因为事务开始/提交(start/commit)需要大量的CPU和磁盘活动。在一个事务内部执行多条语句时因为可能修改若干个相关的表因而同样需要一致性。

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

如果提交了事务,Postgres 将保证要么实现所有更新,要么所有更新都没有实现。事务有标准的ACID(不可分割性,一致性,隔离性,持续性)(atomic,consistent,isolatable,and durable)属性。

注意

请参考 LOCK 语句获取关于在事务内部锁定一个表的详细信息.

使用 COMMITROLLBACK  结束一个事务.

用法

开始一个用户事务:
BEGIN WORK;

兼容性

SQL92

BEGIN 是 Postgres 语言的扩展.在 SQL92 中没有显式的 BEGIN 的定义;事务初始化总是隐含的而且使用一个 COMMITROLLBACK 语句终止.
注意:许多关系型数据库为了方便提供一个自动提交(autocommit)特性。
顺便说一句,BEGIN 关键字在嵌入 SQL 里用于不同的目的。我们建议你在移植数据库应用时仔细检查事务的语意。

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