PostgreSQL事務(wù)的隔離級別目前有4種龙致,分別是:讀未提交绩脆,讀已提交掰茶,可重復(fù)讀暇藏,串行化。
duyeweb=# \h begin
Command: BEGIN
Description: start a transaction block
Syntax:
BEGIN [ WORK | TRANSACTION ] [ transaction_mode [, ...] ]
where transaction_mode is one of:
ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
READ WRITE | READ ONLY
[ NOT ] DEFERRABLE
讀未提交
表示可以讀到其他會話未提交的數(shù)據(jù)(postgresql不支持)濒蒋。
讀已提交
表示可以讀到其他會話已提交的數(shù)據(jù)盐碱。
- 創(chuàng)建一張表為test,插入一條記錄
duyeweb=# create table test(a int, b varchar(128));
CREATE TABLE
duyeweb=# insert into test values(1, 'hello');
INSERT 0 1
- 在會話1中打開事務(wù)進(jìn)行查詢
duyeweb=# begin;
BEGIN
duyeweb=# select * from test;
a | b
---+-------
1 | hello
(1 row)
- 在會話2中打開事務(wù)進(jìn)行更新
duyeweb=# begin;
BEGIN
duyeweb=# update test set b='xxxx';
UPDATE 1
- 此時(shí)在會話2中還沒有關(guān)閉事務(wù)沪伙,在會話1中進(jìn)行查詢
duyeweb=# select * from test;
a | b
---+-------
1 | hello
(1 row)
- 發(fā)現(xiàn)會話1中的記錄并沒有進(jìn)行改變瓮顽。當(dāng)提交會話2中的事務(wù),在會話1中進(jìn)行查詢值已經(jīng)改變
duyeweb=# begin;
BEGIN
duyeweb=# update test set b='xxxx';
UPDATE 1
duyeweb=# commit;
COMMIT
再次查詢:
duyeweb=# select * from test;
a | b
---+------
1 | xxxx
(1 row)
可重復(fù)讀
表示在一個(gè)事務(wù)中围橡,執(zhí)行同一條SQL暖混,讀到的是同樣的數(shù)據(jù)(即使被讀的數(shù)據(jù)可能已經(jīng)被其他會話修改并提交)。
- 在會話1中打開可重復(fù)讀事務(wù)翁授,進(jìn)行查詢
duyeweb=# begin transaction isolation level repeatable read;
BEGIN
duyeweb=# select * from test;
a | b
---+------
1 | xxxx
(1 row)
- 在會話2中進(jìn)行更新操作
duyeweb=# update test set b='yyyyy';
UPDATE 1
- 在會話1中進(jìn)行拣播,發(fā)現(xiàn)會話1中的記錄沒有因?yàn)闀?的提交而變化
duyeweb=# select * from test;
a | b
---+-------
1 | xxxx
(1 row)
- 在會話1中進(jìn)行提交晾咪,再查詢,發(fā)現(xiàn)會話1中的記錄變化了
duyeweb=# commit;
duyeweb=# select * from test;
a | b
---+-------
1 | yyyyy
(1 row)
串行化
表示并行事務(wù)模擬串行執(zhí)行贮配,違反串行執(zhí)行規(guī)則的事務(wù)谍倦,將回滾。
- 在會話 1中打開事務(wù)串行
duyeweb=# begin transaction isolation level serializable;
- 在會話2中打開事務(wù)串行
duyeweb=# begin transaction isolation level serializable;
3泪勒、在會話1中進(jìn)行插入操作
duyeweb=# insert into test select * from test;
INSERT 0 1
duyeweb=# select * from test;
a | b
---+-------
1 | yyyyy
1 | yyyyy
(2 rows)
4昼蛀、在會話2中進(jìn)行插入操作
duyeweb=# insert into test select * from test;
INSERT 0 1
duyeweb=# select * from test;
a | b
---+-------
1 | yyyyy
1 | yyyyy
(2 rows)
5、提交會話1中的事務(wù)圆存,能夠正常提交叼旋,進(jìn)行查詢能夠查到插入的記錄
duyeweb=# end;
COMMIT
duyeweb=# select * from test;
a | b
---+-------
1 | yyyyy
1 | yyyyy
(2 rows)
6、當(dāng)提交會話2的事務(wù)時(shí)會報(bào)錯(cuò)
duyeweb=# end;
ERROR: could not serialize access due to read/write dependencies among transactions
DETAIL: Reason code: Canceled on identification as a pivot, during commit attempt.
HINT: The transaction might succeed if retried.
發(fā)現(xiàn)更多寶藏
我在喜馬拉雅上分享聲音
《PostgreSQL數(shù)據(jù)庫內(nèi)核分析》辽剧,點(diǎn)開鏈接可以聽聽送淆,有點(diǎn)意思。
《數(shù)據(jù)庫系統(tǒng)概論(第4版)》怕轿,點(diǎn)開鏈接可以聽聽偷崩,有點(diǎn)意思。
更多IT有聲課程撞羽,點(diǎn)我發(fā)現(xiàn)更多
其他相關(guān)文章分享列表:
第 23 課 PostgreSQL 創(chuàng)建自己的數(shù)據(jù)庫阐斜、模式、用戶
第 22 課 PostgreSQL 控制文件
第 21 課 PostgreSQL 日志系統(tǒng)
第 16 課 查詢過程源碼分析
第 15 課 PostgreSQL 系統(tǒng)參數(shù)配置
第 14 課 PostgreSQL 數(shù)據(jù)存儲結(jié)構(gòu)
第 13 課 PostgreSQL 存儲之Page(頁面)源碼分析
第 12 課 PostgreSQL 認(rèn)證方式
第 11 課 PostgreSQL 增加一個(gè)內(nèi)核C函數(shù)
第 10 課 PostgreSQL 在內(nèi)核增加一個(gè)配置參數(shù)
第 09 課 PostgreSQL 4種進(jìn)程啟動方式
第 08 課 PostgreSQL 事務(wù)介紹
第 07 課 PostgreSQL 數(shù)據(jù)庫诀紊、模式谒出、表、空間邻奠、用戶間的關(guān)系
第 06 課 PostgreSQL 系統(tǒng)表介紹
第 05 課 PostgreSQL 編譯源代碼進(jìn)行開發(fā)
第 04 課 PostgreSQL 安裝最新的版本
第 03 課 PostgreSQL 代碼結(jié)構(gòu)
第 02 課 PostgreSQL 的特性笤喳、應(yīng)用、安裝
第 01 課 PostgreSQL 簡介及發(fā)展歷程
上面文章都在專輯中:PostgreSQL專輯鏈接碌宴,點(diǎn)我查看
如果有用杀狡,可以收藏這篇文件,隨時(shí)在更新....
更多交流加群: PostgreSQL內(nèi)核開發(fā)群 876673220
親贰镣,記得點(diǎn)贊呜象、留言、打賞額1 9Ф浮!