ITPub博客

首页 > 数据库 > PostgreSQL > PostgreSQL:事务

PostgreSQL:事务

原创 PostgreSQL 作者:Ryan_Bai 时间:2020-12-14 21:40:39 0 删除 编辑

ACID

  • A(Atomicity)—原子性:整个数据库事务是不可分割的工作单位。只有使事务中所有的数据库操作都执行成功,才算整个事务成功。事务中任何一个 SQL 语句执行失败,已经执行成功的 SQL 语句也必须回滚,退回到执行事务前的状态。

  • C(Consistency)—一致性:将数据库从一种状态转变为下一种一致的状态。在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。

  • I(Isolation)—隔离性:每个读写事务的对象对其他事务的操作对象能相互分离,即该事务提交前对其他事务都不可见。

  • D(Durability)—持久性:事务一旦提交,其结果就是永久性的。即使发生宕机等故障,数据库也能将数据恢复。

DDL 事务

大多数 DDL 可以包含在一个事务中,而且也是可以回滚的。因此非常适合把 PostgreSQL 作为 Sharding 的分布式数据库系统。在 Sharding 中,常常需要在多个节点中建相同的表,这是可以把建表语句放在同一个事务中。

AUTOCOMMIT

  1. 关闭自动提交

    \set AUTOCOMMIT off
    \echo :AUTOCOMMIT
  2. 事务

    begi

语句

  • begin:启动一个事务

  • savepoint [savepoint_name]:保存一个保存点,此处可以进行命名,可以用于回滚提交类操作。

  • COMMIT: 保存更改,或者可以使用END TRANSACTION命令

  • ROLLBACK: 回滚事务

  • rollback to SAVEPOINT [savepoint_name]:回滚到某个保存点

两阶段提交

多台数据库之间的原子性,需要通过两阶段提交来实现,有如下五个步骤:

  1. 应用程序先调用各台数据库做一些操作,但不提交事务;然后调用事务协调器中的提交方法。

  2. 事务协调器将联络事务中涉及的没台数据库,并通知它们准备提交事务,这是第一个阶段的开始。在 PostgreSQL 一般是调用“PREPARE TRANSACTION”命令。

  3. 各台数据库接收到“PREPARE TRANSACTION”命令后,如果要返回成功,则数据库必须将自己置于一下状态:确保后续能在被要求提交事物时提交事务,或者在被要求回滚事务时能回滚事务。所以 PostgreSQL 会将已准备好提交的信息写入持久存储区中。如果数据库无法完成此事务,它会直接返回失败给事务协调器。

  4. 事务协调器接收到所有数据库的响应。

  5. 在第二阶段,如果任一数据库在第一阶段返回失败,则事务协调器将会发一个回滚命令(ROLLBACK PREPARED)给各台数据库。如果所有数据库的响应都是成功的,则向各台数据库发送“COMMIT PREPARED”命令,通知各台数据库事务成功。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31490526/viewspace-2742206/,如需转载,请注明出处,否则将追究法律责任。

下一篇: PostgreSQL:锁
请登录后发表评论 登录
全部评论
Oracle ACE Associate; OCMU 用户组成员; Oracle 10g OCE、OCA、OCP; Oracle 11g OCP、OCM; MySQL 5.6 OCP; Oracle 11g OCP讲师; PostgreSQL PGCE 获得者;

注册时间:2017-09-18

  • 博文量
    226
  • 访问量
    261369