PostgreSQL事務隔離級別

T1YSL發表於2021-07-03

1. 概念

髒讀

一個事務讀取了另一個並行未提交事務寫入的資料。

不可重複讀

一個事務重新讀取之前讀取過的資料,發現該資料已經被另一個事務(在初始讀之後提交)修改。

幻讀

一個事務重新執行一個返回符合一個搜尋條件的行集合的查詢, 發現滿足條件的行集合因為另一個最近提交的事務而發生了改變。

序列化異常

成功提交一組事務的結果與這些事務所有可能的序列執行結果都不一致。

2. 事務隔離級別

設定事務隔離級別:

SET TRANSACTION transaction_mode [, ...]

SET TRANSACTION SNAPSHOT snapshot_id

SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode [, ...]


其中 transaction_mode 是下列之一:

ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }

READ WRITE | READ ONLY

[ NOT ] DEFERRABLE

SQL 標準定義了一種額外的級別:READ UNCOMMITTED。在 PostgreSQL中READ UNCOMMITTED被視作 READ COMMITTED。

要用一個已經存在的事務的同一快照開始一個新事務,首先要從該現有 事務匯出快照。這將會返回快照識別符號,

BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;

SELECT pg_export_snapshot();

pg_export_snapshot

---------------------

00000003-0000001B-1

(1 row)

然後在一個新開始的事務的開頭把該快照識別符號用在一個 SET TRANSACTION SNAPSHOT命令中:


BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;

SET TRANSACTION SNAPSHOT '00000003-0000001B-1';

postgres@postgres [local]=> show default_transaction_isolation;

default_transaction_isolation 

-------------------------------

read committed

(1 row)



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69990629/viewspace-2779524/,如需轉載,請註明出處,否則將追究法律責任。

相關文章