缺省时,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 一样的功能。
参考 LOCK 获取有关在事务内部锁定表的更多信息。
如果你把 autocommit 模式关掉,那么就不需要 BEGIN:任何 SQL 命令都自动开始一个事务。