PostgreSQL 默認隔離級別的設(shè)置
PostgreSQL 的默認事務(wù)隔離級別是 讀已提交(Read Committed),這是其事務(wù)處理系統(tǒng)的基礎(chǔ)行為模式。
一 默認隔離級別概述
1.1 默認設(shè)置
-- 查看當前隔離級別 SHOW default_transaction_isolation; -- 典型輸出:read committed
輸出示例:
postgres=# SHOW default_transaction_isolation; default_transaction_isolation ------------------------------- read committed (1 row)
1.2 各版本一致性
| PostgreSQL 版本 | 默認隔離級別 | 主要變化 |
|---|---|---|
| 7.4 及之前 | 讀已提交 | 基礎(chǔ)實現(xiàn) |
| 8.0 - 8.3 | 讀已提交 | 改進快照 |
| 8.4 - 當前 | 讀已提交 | 優(yōu)化實現(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 (默認隔離級別) BEGIN; SELECT balance FROM accounts WHERE id = 1; -- 看到舊值(不阻塞) COMMIT; -- 會話1提交后 -- 會話2再次查詢將看到新值 SELECT balance FROM accounts WHERE id = 1; -- 看到新值
三 與其他隔離級別對比
3.1 完整隔離級別支持
| 隔離級別 | 臟讀 | 不可重復(fù)讀 | 幻讀 | 實現(xiàn)機制 |
|---|---|---|---|---|
| 讀未提交 | ? 允許 | ? 允許 | ? 允許 | 實際實現(xiàn)為讀已提交 |
| 讀已提交 | ? 防止 | ? 允許 | ? 允許 | 語句級快照(默認) |
| 可重復(fù)讀 | ? 防止 | ? 防止 | ? 允許 | 事務(wù)級快照 |
| 可串行化 | ? 防止 | ? 防止 | ? 防止 | 謂詞鎖+沖突檢測 |
3.2 性能與一致性權(quán)衡

四 如何修改隔離級別
4.1 會話級修改
BEGIN; SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; -- 后續(xù)操作使用新隔離級別 COMMIT;
4.2 連接級默認設(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 | 讀已提交 | 平衡性能與一致性 |
| 財務(wù)系統(tǒng) | 可重復(fù)讀 | 防止余額不一致 |
| 報表查詢 | 可重復(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;
六 特殊注意事項
6.1 讀未提交的實際行為
盡管SQL標準支持,但PostgreSQL實際將READ UNCOMMITTED視為READ COMMITTED:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; -- 實際仍為讀已提交
6.2 可重復(fù)讀的幻讀"保護"
PostgreSQL的可重復(fù)讀實際上通過快照技術(shù)也防止了幻讀,這比SQL標準要求更強。
七 版本演進
| 版本 | 隔離級別重要改進 |
|---|---|
| 8.1 | 引入SSI(可串行化快照隔離)基礎(chǔ) |
| 9.1 | 完善SSI實現(xiàn) |
| 9.5 | 優(yōu)化可串行化沖突檢測 |
| 12 | 改進快照獲取性能 |
PostgreSQL選擇讀已提交作為默認隔離級別,反映了其設(shè)計哲學:
- 實用主義:平衡性能與一致性需求
- 可預(yù)測性:行為符合大多數(shù)開發(fā)者預(yù)期
- 可擴展性:允許用戶按需提升隔離級別
更詳細的內(nèi)容請查看官方文檔:https://www.postgresql.org/docs/17/transaction-iso.html
到此這篇關(guān)于PostgreSQL 默認隔離級別的設(shè)置的文章就介紹到這了,更多相關(guān)PostgreSQL 默認隔離級別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PostgreSQL教程(四):數(shù)據(jù)類型詳解
這篇文章主要介紹了PostgreSQL教程(四):數(shù)據(jù)類型詳解,本文講解了數(shù)值類型、字符類型、布爾類型、位串類型、數(shù)組、復(fù)合類型等數(shù)據(jù)類型,需要的朋友可以參考下2015-05-05
postgresql 利用fdw來實現(xiàn)不同數(shù)據(jù)庫之間數(shù)據(jù)互通(推薦)
這篇文章主要介紹了postgresql 利用fdw來實現(xiàn)不同數(shù)據(jù)庫之間數(shù)據(jù)互通,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02
啟動PostgreSQL服務(wù)器 并用pgAdmin連接操作
這篇文章主要介紹了啟動PostgreSQL服務(wù)器 并用pgAdmin連接操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
postgresql如何找到表中重復(fù)數(shù)據(jù)的行并刪除
這篇文章主要介紹了postgresql如何找到表中重復(fù)數(shù)據(jù)的行并刪除問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05
SQL Server數(shù)據(jù)遷移至PostgreSQL出錯的解釋以及解決方案
最近對SQL Server到PostgreSQL的數(shù)據(jù)遷移時出現(xiàn)了問題,返回的錯誤為:invalid byte sequence for encoding "UTF8": 0x00。經(jīng)查證pg源代碼,該問題引起的原因是sql server的字符類型字段中含有空字符\0,該字符在pg中不支持。2014-09-09
PostgreSQL數(shù)據(jù)庫時間類型相加減操作
PostgreSQL提供了許多函數(shù),這些函數(shù)返回與當前日期和時間相關(guān)的值,下面這篇文章主要給大家介紹了關(guān)于PostgreSQL數(shù)據(jù)庫時間類型相加減操作的相關(guān)資料,需要的朋友可以參考下2023-10-10

