BEGIN
BEGIN — 开始一个事务块
大纲
BEGIN [ WORK | TRANSACTION ]
输入
- WORK
TRANSACTION 可选的关键字。它们没有效果。
输出
BEGIN这表示一个新的事务已经启动。
WARNING: BEGIN: already a transaction in progress这表示已经有一个事务在进行中。当前事务不受影响。
描述
默认情况下,PostgreSQL 以
unchained mode(非链模式,在其他数据库系统中也称为“autocommit”(自动提交))执行事务。换句话说,每条用户语句都在它自己的事务中执行,并且在语句结束时隐式地执行一次提交(如果执行成功,否则执行一次回滚)。BEGIN 以链模式开启一个用户事务,也就是说,BEGIN 命令之后的所有用户语句都将在单个事务中执行,直到显式的COMMIT或ROLLBACK。在链模式中语句执行得更快,因为事务的启动/提交需要可观的 CPU 和磁盘活动。在一个事务中执行多条语句也有助于在更改多个相关表时确保一致性:其他客户端将无法看到相关更新尚未全部完成的中间状态。
PostgreSQL 中的默认事务隔离级别是 READ COMMITTED,其中事务内的每个查询只看到在该查询开始执行之前提交的更改。因此,如果你需要更严格的事务隔离,就必须使用
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE,紧跟在 BEGIN 之后。(或者,你也可以更改默认事务隔离级别;细节见PostgreSQL 管理员指南。)在 SERIALIZABLE 模式中,查询只会看到在整个事务开始之前(实际上,是在该事务中第一条 DML 语句执行之前)提交的更改。
事务具有标准的 ACID(原子性、一致性、隔离性、持久性)属性。
注意
START TRANSACTION具有与
BEGIN 相同的功能。
关于在事务中锁定表的进一步信息,请参阅LOCK。
如果你关闭 autocommit 模式,就不再需要
BEGIN:任何 SQL 命令都会自动开启一个事务。
用法
开始一个用户事务:
BEGIN WORK;
兼容性
SQL92
BEGIN
是一种 PostgreSQL 语言扩展。没有显式的 BEGIN
命令出现在 SQL92 中;事务的开启总是隐式的,它以
COMMIT 或 ROLLBACK 语句终止。
注意
许多关系数据库系统出于便利提供自动提交特性。
顺便一提,BEGIN 关键字在嵌入式 SQL 中用于不同的目的。在移植数据库应用程序时,建议注意事务语义。
SQL92 还要求 SERIALIZABLE 是默认的事务隔离级别。