PostgreSQL中提供了多種數(shù)據(jù)完整性的保證機(jī)制袜蚕。如:約束、觸發(fā)器亩钟、事務(wù)和鎖管理等乓梨。
事務(wù)主要是為了保證一組相關(guān)數(shù)據(jù)庫(kù)的操作能全部執(zhí)行成功,從而保證數(shù)據(jù)的完整性清酥。鎖機(jī)制主要是控制多個(gè)用戶對(duì)同一數(shù)據(jù)進(jìn)行操作扶镀,使用鎖機(jī)制可以解決并發(fā)問(wèn)題。
- 事務(wù)
事務(wù)是用戶對(duì)一個(gè)數(shù)據(jù)庫(kù)操作的一個(gè)序列焰轻,這些操作要么全做臭觉,要么全不做,是一個(gè)不可分割的單位。
事務(wù)管理的常用語(yǔ)句如下:
BEGIN;
SQL語(yǔ)句1;
SQL語(yǔ)句2;
...
COMMIT;
事務(wù)塊是指包圍在BEGIN和COMMIT之間的語(yǔ)句蝠筑。在PostgreSQL9中狞膘,常用的事務(wù)塊管理語(yǔ)句含義如下:
START TRANSACTION:此命令表示開始一個(gè)新的事務(wù)塊.
BEGIN:初始化一個(gè)事務(wù)塊。在BEGIN命令后的語(yǔ)句都將在一個(gè)事務(wù)里面執(zhí)行什乙,知道遇見COMMIT或ROLLBACK挽封。它和START TRANSACTION是一樣的。
COMMIT:提交事務(wù)臣镣。
ROLLBACK:事務(wù)失敗時(shí)執(zhí)行回滾操作辅愿。
SET TRANSACTION:設(shè)置當(dāng)前事務(wù)的特性。對(duì)后面的事務(wù)沒有影響忆某。
- 事務(wù)隔離及并發(fā)控制
PostgreSQL是一個(gè)支持多用戶的數(shù)據(jù)庫(kù)点待,當(dāng)多個(gè)用戶操作同一數(shù)據(jù)庫(kù)時(shí),并發(fā)控制要保證所有用戶可以高效的訪問(wèn)的同時(shí)不破壞數(shù)據(jù)的完整性弃舒。
數(shù)據(jù)庫(kù)中數(shù)據(jù)的并發(fā)操作經(jīng)常發(fā)生癞埠,而對(duì)數(shù)據(jù)的并發(fā)操作會(huì)帶來(lái)下面的一些問(wèn)題:
- 臟讀
一個(gè)事務(wù)讀取了另一個(gè)未提交事務(wù)寫入的數(shù)據(jù)。 - 不可重復(fù)讀
一個(gè)事務(wù)重新讀取前面讀取過(guò)的數(shù)據(jù)聋呢,發(fā)現(xiàn)該數(shù)據(jù)已經(jīng)被另一個(gè)已經(jīng)提交的事務(wù)修改燕差。 - 幻讀
一個(gè)事務(wù)重新執(zhí)行一個(gè)查詢,返回符合查詢條件的行的集合坝冕,發(fā)現(xiàn)滿足查詢條件的行的集合因?yàn)槠渌罱峤坏氖聞?wù)而發(fā)生了改變徒探。
SQL標(biāo)準(zhǔn)定義了四個(gè)級(jí)別的事務(wù)隔離。
隔離級(jí)別 | 臟讀 | 幻讀 | 不可重復(fù)性讀取 |
---|---|---|---|
讀未提交 | 可能 | 可能 | 可能 |
讀已提交 | 不可能 | 可能 | 可能 |
可重復(fù)讀 | 不可能 | 可能 | 不可能 |
可串行讀 | 不可能 | 不可能 | 不可能 |
在PostgreSQL中喂窟,可以請(qǐng)求4種隔離級(jí)別中的任意一種测暗。但是在內(nèi)部,實(shí)際上只有兩種獨(dú)立的隔離級(jí)別磨澡,分別對(duì)應(yīng)已提交和可串行化碗啄。如果選擇了讀未提交的級(jí)別,實(shí)際上使用的是讀已提交稳摄,在選擇可重復(fù)讀級(jí)別的時(shí)候稚字,實(shí)際上用的是可串行化,所以實(shí)際的隔離級(jí)別可能比選擇的更嚴(yán)格厦酬。這是SQL標(biāo)準(zhǔn)允許的:4種隔離級(jí)別只定義了哪種現(xiàn)象不能發(fā)生胆描,但是沒有定義哪種現(xiàn)象一定發(fā)生。
PostgreSQL只提供兩種隔離級(jí)別的原因是仗阅,這是把標(biāo)準(zhǔn)的隔離級(jí)別與多版本并發(fā)控制架構(gòu)映射相關(guān)的唯一合理方法昌讲。
- 讀已提交
這是PostgreSQL中默認(rèn)的隔離級(jí)別,當(dāng)一個(gè)事務(wù)運(yùn)行在這個(gè)隔離級(jí)別時(shí)减噪,一個(gè)SELECT查詢只能看到查詢開始前已提交的數(shù)據(jù)短绸,而無(wú)法看到未提交的數(shù)據(jù)或者在查詢期間其他的事務(wù)已提交的數(shù)據(jù)车吹。 - 可串行化
可串行化提供最嚴(yán)格的事務(wù)隔離。這個(gè)級(jí)別模擬串行的事務(wù)執(zhí)行醋闭,就好像事務(wù)是一個(gè)接著一個(gè)串行的執(zhí)行窄驹。不過(guò),這個(gè)級(jí)別的應(yīng)用必須準(zhǔn)備在串行化失敗的時(shí)候重新啟動(dòng)事務(wù)证逻。