缺省时,Postgres 以 非链接模式(unchained mode) (在其他数据库系统里也称之为“自动提交("autocommit"))”。 换句话说, 每个用户语句都是在其自身的事务中运行并且在语句结束时隐含的调用一个提交 (commit)(如果执行成功则提交,否则调用一个回卷)。 BEGIN 以链接模式(chained mode)初始化一个用户事务, 也就是说所有 BEGIN 命令后的用户语句都将在一个事务里面执行直到一个明确的 COMMIT, ROLLBACK, 或执行退出(abort)。在链接模式里执行的语句很明显地快得多, 因为事务开始/提交(start/commit)需要大量的CPU和磁盘活动。在一个 事务内部执行多条语句时因为可能修改若干个相关的表因而同样需要一致性。
在 Postgres 里缺省的事务隔离级别是 READ COMMITTED, 这时在事务内部的查询只看到查询提交之前的(数据)修改。 所以,如果你需要更严格的事务隔离,你必须在 BEGIN 后马上使用 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE。 在 SERIALIZABLE 模式里,查询将只能看到整个事务开始之前的修改。 (实际上是在一个可串行化事务内部第一个 DML 语句执行前的数据)。
如果提交了事务, Postgres 将保证要么实现所有更新, 要么所有更新都没有实现。事务有标准的 ACID (原子性,一致性,隔离性,持续性) (atomic,consistent,isolatable,and durable)属性。