PostgreSQL 默認(rèn)隔離級別的設(shè)置
PostgreSQL 的默認(rèn)事務(wù)隔離級別是 讀已提交(Read Committed),這是其事務(wù)處理系統(tǒng)的基礎(chǔ)行為模式。
一 默認(rèn)隔離級別概述
1.1 默認(rèn)設(shè)置
-- 查看當(dāng)前隔離級別 SHOW default_transaction_isolation; -- 典型輸出:read committed
輸出示例:
postgres=# SHOW default_transaction_isolation; default_transaction_isolation ------------------------------- read committed (1 row)
1.2 各版本一致性
PostgreSQL 版本 | 默認(rèn)隔離級別 | 主要變化 |
---|---|---|
7.4 及之前 | 讀已提交 | 基礎(chǔ)實(shí)現(xiàn) |
8.0 - 8.3 | 讀已提交 | 改進(jìn)快照 |
8.4 - 當(dāng)前 | 讀已提交 | 優(yōu)化實(shí)現(xiàn) |
二 讀已提交的特性
2.1 行為特征
- 語句級快照:每條SQL語句看到的是語句開始時已提交的數(shù)據(jù)
- 無臟讀:絕不會讀取未提交的數(shù)據(jù)
- 允許非重復(fù)讀:同一事務(wù)內(nèi)相同查詢可能返回不同結(jié)果
- 允許幻讀:可能看到其他事務(wù)新增的符合條件的行
2.2 并發(fā)場景示例
-- 會話1 BEGIN; UPDATE accounts SET balance = balance - 100 WHERE id = 1; -- 會話2 (默認(rèn)隔離級別) BEGIN; SELECT balance FROM accounts WHERE id = 1; -- 看到舊值(不阻塞) COMMIT; -- 會話1提交后 -- 會話2再次查詢將看到新值 SELECT balance FROM accounts WHERE id = 1; -- 看到新值
三 與其他隔離級別對比
3.1 完整隔離級別支持
隔離級別 | 臟讀 | 不可重復(fù)讀 | 幻讀 | 實(shí)現(xiàn)機(jī)制 |
---|---|---|---|---|
讀未提交 | ? 允許 | ? 允許 | ? 允許 | 實(shí)際實(shí)現(xiàn)為讀已提交 |
讀已提交 | ? 防止 | ? 允許 | ? 允許 | 語句級快照(默認(rèn)) |
可重復(fù)讀 | ? 防止 | ? 防止 | ? 允許 | 事務(wù)級快照 |
可串行化 | ? 防止 | ? 防止 | ? 防止 | 謂詞鎖+沖突檢測 |
3.2 性能與一致性權(quán)衡
四 如何修改隔離級別
4.1 會話級修改
BEGIN; SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; -- 后續(xù)操作使用新隔離級別 COMMIT;
4.2 連接級默認(rèn)設(shè)置
ALTER DATABASE dbname SET default_transaction_isolation = 'repeatable read';
4.3 參數(shù)文件設(shè)置
# postgresql.conf default_transaction_isolation = 'repeatable read'
五 生產(chǎn)環(huán)境建議
5.1 使用指南
場景類型 | 推薦隔離級別 | 理由 |
---|---|---|
大多數(shù)OLTP | 讀已提交 | 平衡性能與一致性 |
財(cái)務(wù)系統(tǒng) | 可重復(fù)讀 | 防止余額不一致 |
報(bào)表查詢 | 可重復(fù)讀 | 保證數(shù)據(jù)快照一致 |
高競爭系統(tǒng) | 可串行化 | 防止并發(fā)異常 |
5.2 監(jiān)控長事務(wù)
-- 檢查可能造成問題的長事務(wù) SELECT pid, now() - xact_start AS duration, query FROM pg_stat_activity WHERE state = 'idle in transaction' ORDER BY duration DESC;
六 特殊注意事項(xiàng)
6.1 讀未提交的實(shí)際行為
盡管SQL標(biāo)準(zhǔn)支持,但PostgreSQL實(shí)際將READ UNCOMMITTED
視為READ COMMITTED
:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; -- 實(shí)際仍為讀已提交
6.2 可重復(fù)讀的幻讀"保護(hù)"
PostgreSQL的可重復(fù)讀實(shí)際上通過快照技術(shù)也防止了幻讀,這比SQL標(biāo)準(zhǔn)要求更強(qiáng)。
七 版本演進(jìn)
版本 | 隔離級別重要改進(jìn) |
---|---|
8.1 | 引入SSI(可串行化快照隔離)基礎(chǔ) |
9.1 | 完善SSI實(shí)現(xiàn) |
9.5 | 優(yōu)化可串行化沖突檢測 |
12 | 改進(jìn)快照獲取性能 |
PostgreSQL選擇讀已提交作為默認(rèn)隔離級別,反映了其設(shè)計(jì)哲學(xué):
- 實(shí)用主義:平衡性能與一致性需求
- 可預(yù)測性:行為符合大多數(shù)開發(fā)者預(yù)期
- 可擴(kuò)展性:允許用戶按需提升隔離級別
更詳細(xì)的內(nèi)容請查看官方文檔:https://www.postgresql.org/docs/17/transaction-iso.html
到此這篇關(guān)于PostgreSQL 默認(rèn)隔離級別的設(shè)置的文章就介紹到這了,更多相關(guān)PostgreSQL 默認(rèn)隔離級別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
postgresql 兩表關(guān)聯(lián)更新操作
這篇文章主要介紹了postgresql 兩表關(guān)聯(lián)更新操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01postgresql數(shù)據(jù)庫配置文件postgresql.conf,pg_hba.conf,pg_ident.conf
這篇文章主要為大家介紹了postgresql數(shù)據(jù)庫中三個重要的配置文件postgresql.conf,pg_hba.conf,pg_ident.conf使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02如何獲取PostgreSQL數(shù)據(jù)庫中的JSON值
這篇文章主要介紹了如何獲取PostgreSQL數(shù)據(jù)庫中的JSON值操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01Mac系統(tǒng)重置PostgreSQL密碼的方法示例代碼
PostgreSQL 是一個免費(fèi)的對象-關(guān)系數(shù)據(jù)庫服務(wù)器(ORDBMS),在靈活的BSD許可證下發(fā)行。這篇文章主要介紹了Mac系統(tǒng)重置PostgreSQL密碼的方法示例代碼,需要的朋友可以參考下2020-02-02PostgreSQL 數(shù)據(jù)同步到ES 搭建操作
這篇文章主要介紹了PostgreSQL 數(shù)據(jù)同步到ES 搭建操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01