PostgreSQL:事務

Ryan_Bai發表於2020-12-14

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章