Postgresql 的預設隔離級別

gongchengship發表於2024-07-04

PostgreSQL 的預設事務隔離級別是 READ COMMITTED

隔離級別概述

資料庫的隔離級別決定了事務在併發環境下相互隔離的程度,從而影響到併發事務的行為。SQL 標準定義了四種隔離級別:

  1. READ UNCOMMITTED(未提交讀)
  2. READ COMMITTED(提交讀)
  3. REPEATABLE READ(可重複讀)
  4. SERIALIZABLE(可序列化)

每種隔離級別解決不同型別的併發問題,包括髒讀、不可重複讀和幻讀。以下是對每種隔離級別的簡要描述:

  • READ UNCOMMITTED: 允許事務讀取未提交的資料(可能導致髒讀)。
  • READ COMMITTED: 只允許事務讀取已提交的資料(防止髒讀,但可能出現不可重複讀)。
  • REPEATABLE READ: 保證在同一個事務內多次讀取相同資料結果一致(防止髒讀和不可重複讀,但可能出現幻讀)。
  • SERIALIZABLE: 最嚴格的隔離級別,透過強制事務序列執行來防止所有併發問題(防止髒讀、不可重複讀和幻讀)。

PostgreSQL 的預設隔離級別

PostgreSQL 的預設隔離級別是 READ COMMITTED。在此隔離級別下,每個查詢只能看到在查詢開始之前已提交的資料。如果一個事務在執行過程中看到其他事務提交的資料,則會得到不同的結果,這就是不可重複讀的現象。

如何檢視和設定隔離級別

您可以透過以下方式檢視和設定 PostgreSQL 的事務隔離級別:

檢視當前會話隔離級別

SHOW TRANSACTION ISOLATION LEVEL;

設定當前會話隔離級別

SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ COMMITTED;

設定全域性隔離級別

要設定 PostgreSQL 的全域性隔離級別(即預設隔離級別),需要在 postgresql.conf 檔案中進行配置,或透過 SQL 命令進行更改。修改 postgresql.conf 檔案時,可以新增或編輯以下行:

default_transaction_isolation = 'read committed'

也可以使用 SQL 命令:

ALTER DATABASE your_database_name SET default_transaction_isolation TO 'read committed';

示例

檢視當前會話的隔離級別

SHOW TRANSACTION ISOLATION LEVEL;

將當前會話的隔離級別設定為 REPEATABLE READ

SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL REPEATABLE READ;

將當前事務的隔離級別設定為 SERIALIZABLE

BEGIN;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
-- 執行事務操作
COMMIT;

結論

PostgreSQL 的預設事務隔離級別是 READ COMMITTED。這種隔離級別在大多數情況下提供了良好的效能和足夠的資料一致性。根據具體應用需求,您可以在會話級別或事務級別調整隔離級別以適應特定的使用場景。

相關文章