ACID
A(Atomicity)—原子性:整个数据库事务是不可分割的工作单位。只有使事务中所有的数据库操作都执行成功,才算整个事务成功。事务中任何一个 SQL 语句执行失败,已经执行成功的 SQL 语句也必须回滚,退回到执行事务前的状态。
C(Consistency)—一致性:将数据库从一种状态转变为下一种一致的状态。在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
I(Isolation)—隔离性:每个读写事务的对象对其他事务的操作对象能相互分离,即该事务提交前对其他事务都不可见。
D(Durability)—持久性:事务一旦提交,其结果就是永久性的。即使发生宕机等故障,数据库也能将数据恢复。
DDL 事务
大多数 DDL 可以包含在一个事务中,而且也是可以回滚的。因此非常适合把 PostgreSQL 作为 Sharding 的分布式数据库系统。在 Sharding 中,常常需要在多个节点中建相同的表,这是可以把建表语句放在同一个事务中。
AUTOCOMMIT
关闭自动提交
\set AUTOCOMMIT off \echo :AUTOCOMMIT
事务
begi
语句
begin:启动一个事务
savepoint [savepoint_name]:保存一个保存点,此处可以进行命名,可以用于回滚提交类操作。
COMMIT: 保存更改,或者可以使用END TRANSACTION命令
ROLLBACK: 回滚事务
rollback to SAVEPOINT [savepoint_name]:回滚到某个保存点
两阶段提交
多台数据库之间的原子性,需要通过两阶段提交来实现,有如下五个步骤:
应用程序先调用各台数据库做一些操作,但不提交事务;然后调用事务协调器中的提交方法。
事务协调器将联络事务中涉及的没台数据库,并通知它们准备提交事务,这是第一个阶段的开始。在 PostgreSQL 一般是调用“PREPARE TRANSACTION”命令。
各台数据库接收到“PREPARE TRANSACTION”命令后,如果要返回成功,则数据库必须将自己置于一下状态:确保后续能在被要求提交事物时提交事务,或者在被要求回滚事务时能回滚事务。所以 PostgreSQL 会将已准备好提交的信息写入持久存储区中。如果数据库无法完成此事务,它会直接返回失败给事务协调器。
事务协调器接收到所有数据库的响应。
在第二阶段,如果任一数据库在第一阶段返回失败,则事务协调器将会发一个回滚命令(ROLLBACK PREPARED)给各台数据库。如果所有数据库的响应都是成功的,则向各台数据库发送“COMMIT PREPARED”命令,通知各台数据库事务成功。
