PostgreSQL TRANSACTION(事務(wù))

2020-04-22 17:57 更新

TRANSACTION(事務(wù))是數(shù)據(jù)庫管理系統(tǒng)執(zhí)行過程中的一個(gè)邏輯單位,由一個(gè)有限的數(shù)據(jù)庫操作序列構(gòu)成。

數(shù)據(jù)庫事務(wù)通常包含了一個(gè)序列的對(duì)數(shù)據(jù)庫的讀/寫操作。包含有以下兩個(gè)目的:

  • 為數(shù)據(jù)庫操作序列提供了一個(gè)從失敗中恢復(fù)到正常狀態(tài)的方法,同時(shí)提供了數(shù)據(jù)庫即使在異常狀態(tài)下仍能保持一致性的方法。
  • 當(dāng)多個(gè)應(yīng)用程序在并發(fā)訪問數(shù)據(jù)庫時(shí),可以在這些應(yīng)用程序之間提供一個(gè)隔離方法,以防止彼此的操作互相干擾。

當(dāng)事務(wù)被提交給了數(shù)據(jù)庫管理系統(tǒng)(DBMS),則 DBMS 需要確保該事務(wù)中的所有操作都成功完成且其結(jié)果被永久保存在數(shù)據(jù)庫中,如果事務(wù)中有的操作沒有成功完成,則事務(wù)中的所有操作都需要回滾,回到事務(wù)執(zhí)行前的狀態(tài);同時(shí),該事務(wù)對(duì)數(shù)據(jù)庫或者其他事務(wù)的執(zhí)行無影響,所有的事務(wù)都好像在獨(dú)立的運(yùn)行。

事務(wù)的屬性

事務(wù)具有以下四個(gè)標(biāo)準(zhǔn)屬性,通常根據(jù)首字母縮寫為 ACID:

  • 原子性(Atomicity):事務(wù)作為一個(gè)整體被執(zhí)行,包含在其中的對(duì)數(shù)據(jù)庫的操作要么全部被執(zhí)行,要么都不執(zhí)行。
  • 一致性(Consistency):事務(wù)應(yīng)確保數(shù)據(jù)庫的狀態(tài)從一個(gè)一致狀態(tài)轉(zhuǎn)變?yōu)榱硪粋€(gè)一致狀態(tài)。一致狀態(tài)的含義是數(shù)據(jù)庫中的數(shù)據(jù)應(yīng)滿足完整性約束。
  • 隔離性(Isolation):多個(gè)事務(wù)并發(fā)執(zhí)行時(shí),一個(gè)事務(wù)的執(zhí)行不應(yīng)影響其他事務(wù)的執(zhí)行。
  • 持久性(Durability):已被提交的事務(wù)對(duì)數(shù)據(jù)庫的修改應(yīng)該永久保存在數(shù)據(jù)庫中。

例子

某人要在商店使用電子貨幣購(gòu)買100元的東西,當(dāng)中至少包括兩個(gè)操作:

  • 該人賬戶減少 100 元。
  • 商店賬戶增加100元。

支持事務(wù)的數(shù)據(jù)庫管理系統(tǒng)就是要確保以上兩個(gè)操作(整個(gè)"事務(wù)")都能完成,或一起取消,否則就會(huì)出現(xiàn) 100 元平白消失或出現(xiàn)的情況。

事務(wù)控制

使用下面的命令來控制事務(wù):

  • BEGIN TRANSACTION:開始一個(gè)事務(wù)。COMMIT:事務(wù)確認(rèn),或者可以使用 END TRANSACTION 命令。ROLLBACK:事務(wù)回滾。

事務(wù)控制命令只與 INSERT、UPDATE 和 DELETE 一起使用。他們不能在創(chuàng)建表或刪除表時(shí)使用,因?yàn)檫@些操作在數(shù)據(jù)庫中是自動(dòng)提交的。

BEGIN TRANSACTION 命令

事務(wù)可以使用 BEGIN TRANSACTION 命令或簡(jiǎn)單的 BEGIN 命令來啟動(dòng)。此類事務(wù)通常會(huì)持續(xù)執(zhí)行下去,直到遇到下一個(gè) COMMIT 或 ROLLBACK 命令。不過在數(shù)據(jù)庫關(guān)閉或發(fā)生錯(cuò)誤時(shí),事務(wù)處理也會(huì)回滾。以下是啟動(dòng)一個(gè)事務(wù)的簡(jiǎn)單語法:

BEGIN;

或者

BEGIN TRANSACTION;

COMMIT 命令

COMMIT 命令是用于把事務(wù)調(diào)用的更改保存到數(shù)據(jù)庫中的事務(wù)命令,即確認(rèn)事務(wù)。

COMMIT 命令的語法如下:

COMMIT;

或者

END TRANSACTION;

ROLLBACK 命令

ROLLBACK 命令是用于撤消尚未保存到數(shù)據(jù)庫的事務(wù)命令,即回滾事務(wù)。

ROLLBACK 命令的語法如下:

ROLLBACK;

實(shí)例

創(chuàng)建 COMPANY 表 ,數(shù)據(jù)內(nèi)容如下:

w3cschooldb# select * from COMPANY;
 id | name  | age | address   | salary
----+-------+-----+-----------+--------
  1 | Paul  |  32 | California|  20000
  2 | Allen |  25 | Texas     |  15000
  3 | Teddy |  23 | Norway    |  20000
  4 | Mark  |  25 | Rich-Mond |  65000
  5 | David |  27 | Texas     |  85000
  6 | Kim   |  22 | South-Hall|  45000
  7 | James |  24 | Houston   |  10000
(7 rows)

現(xiàn)在,讓我們開始一個(gè)事務(wù),并從表中刪除 age = 25 的記錄,最后,我們使用 ROLLBACK 命令撤消所有的更改。

w3cschooldb=# BEGIN;
DELETE FROM COMPANY WHERE AGE = 25;
ROLLBACK;

檢查 COMPANY 表,仍然有以下記錄:

 id | name  | age | address   | salary
----+-------+-----+-----------+--------
  1 | Paul  |  32 | California|  20000
  2 | Allen |  25 | Texas     |  15000
  3 | Teddy |  23 | Norway    |  20000
  4 | Mark  |  25 | Rich-Mond |  65000
  5 | David |  27 | Texas     |  85000
  6 | Kim   |  22 | South-Hall|  45000
  7 | James |  24 | Houston   |  10000

現(xiàn)在,讓我們開始另一個(gè)事務(wù),從表中刪除 age = 25 的記錄,最后我們使用 COMMIT 命令提交所有的更改。

w3cschooldb=# BEGIN;
DELETE FROM COMPANY WHERE AGE = 25;
COMMIT;

檢查 COMPANY 表,記錄已被刪除:

id | name  | age | address    | salary
----+-------+-----+------------+--------
  1 | Paul  |  32 | California |  20000
  3 | Teddy |  23 | Norway     |  20000
  5 | David |  27 | Texas      |  85000
  6 | Kim   |  22 | South-Hall |  45000
  7 | James |  24 | Houston    |  10000
(5 rows)


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)