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"模式执行事务,也就是说,每个语句在其自身的事务中执行,并且在语句结束的时候,如果执行成功则隐含地执行一个提交,否则执行回滚。
在事务块里执行的语句很明显地快得多,因为事务开始/提交需要大量的 CPU 和磁盘活动。在一个事务内部执行多条语句对于修改若干个相关的表的时候也是很有用的:在所有相关的更新完成之前,其它会话看不到中间的状态。
如果声明了隔离级别或者读/写模式,那么新事务将具有那些特征。就像执行了 SET TRANSACTION 一样。
START TRANSACTION 有着和 BEGIN 一样的功能。
在一个现有事务块内部发出一个 BEGIN 将产生一个警告信息。事务的状态将不会被影响。要想在一个事务块里嵌套事务,请使用保存点(参见 SAVEPOINT)。
出于向下兼容考虑,在随后的 transaction_modes 之间的逗号可以忽略。
BEGIN 是 PostgreSQL 语言的扩展。等价于 SQL 标准中的 START TRANSACTION 命令,可以参考附加的兼容性信息。
顺便说一句,BEGIN 关键字在嵌入 SQL 里用于不同目的。建议你在移植数据库应用时仔细检查事务的语意。