BEGIN
语法
BEGIN [ WORK | TRANSACTION ]
可选关键字。它们没有作用。
输出
-
BEGIN
-
这表明一个新的事务已经开始.
-
NOTICE: BEGIN: already a transaction in progress
这表明该事务已经运行,当前事务没有被影响.
描述
缺省时,
Postgres 以
非链接模式(
unchained
mode)执行一个事务(在其他数据库系统里也称之为“自动提交”(
"autocommit"))。换句话说,每个用户语句都是在其自身的事务中运行并且在语句结束时隐含的调用一个提交(commit)(如果执行成功则提交,否则调用一个回卷)。
BEGIN
以链接模式(chained mode)初始化一个用户事务,也就是说所有
BEGIN
命令后的用户语句都将在一个事务里面执行直到一个显式的
COMMIT,
ROLLBACK,或执行退出。在链接模式里执行的语句很明显地快得多,因为事务开始/提交(start/commit)需要大量的CPU和磁盘活动。在一个事务内部执行多条语句时因为可能修改若干个相关的表因而同样需要一致性。
在 Postgres 里缺省的事务隔离级别是
READ COMMITTED,这时在事务内部的查询只看到查询提交之前的(数据)修改。所以,如果你需要更严格的事务隔离,你必须在
BEGIN
后马上使用 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE。在 SERIALIZABLE
模式里,查询将只能看到整个事务开始之前的修改。(实际上是在一个可串行化事务内部第一个
DML 语句执行前的数据)。
如果提交了事务,Postgres 将保证要么实现所有更新,要么所有更新都没有实现。事务有标准的ACID(不可分割性,一致性,隔离性,持续性)(atomic,consistent,isolatable,and
durable)属性。
用法
开始一个用户事务:
BEGIN WORK;
兼容性
SQL92
BEGIN 是
Postgres 语言的扩展.在
SQL92
中没有显式的
BEGIN 的定义;事务初始化总是隐含的而且使用一个
COMMIT
或
ROLLBACK 语句终止.
注意:许多关系型数据库为了方便提供一个自动提交(autocommit)特性。
顺便说一句,
BEGIN 关键字在嵌入 SQL 里用于不同的目的。我们建议你在移植数据库应用时仔细检查事务的语意。
SQL92 还要求事务的缺省隔离级别是 SERIALIZABLE。