apple=# begin; BEGIN apple=# set transaction ISOLATION LEVEL read committed ; SET apple=# select * from test; id | info ----+------- 2 | test 3 | test1 4 | test1 5 | test 6 | test 7 | test 8 | test1 9 | test1 10 | test 11 | test 1 | test 1 | test 1 | test 1 | test 1 | test (15 rows)
中間別的連接插入一條數據,並提交,在本事務內查詢,多了一條。
apple=# select * from test; id | info ----+------- 2 | test 3 | test1 4 | test1 5 | test 6 | test 7 | test 8 | test1 9 | test1 10 | test 11 | test 1 | test 1 | test 1 | test 1 | test 1 | test 1 | test (16 rows) apple=# commit; COMMIT
設置隔離級別為可重復讀:
apple=# begin; BEGIN apple=# set transaction ISOLATION LEVEL repeatable READ; SET apple=# select * from test; id | info ----+------- 2 | test 3 | test1 4 | test1 5 | test 6 | test 7 | test 8 | test1 9 | test1 10 | test 11 | test 1 | test 1 | test 1 | test 1 | test 1 | test 1 | test (16 rows)
中間別的連接插入一條數據,並查詢:
apple=# select * from test; id | info ----+------- 2 | test 3 | test1 4 | test1 5 | test 6 | test 7 | test 8 | test1 9 | test1 10 | test 11 | test 1 | test 1 | test 1 | test 1 | test 1 | test 1 | test (16 rows) apple=#
設置隔離級別只能在事物段中執行:
apple=# set transaction ISOLATION LEVEL repeatable READ; WARNING: SET TRANSACTION can only be used in transaction blocks SET
在PG配置文件有一項配置提交級別:
#default_transaction_isolation = 'read committed'
Read committed(讀已提交)
讀已提交是PostgreSQL中的默認隔離級別。 當一個事務運行使用這個隔離級別時, 一個查詢(沒有FOR UPDATE/SHARE子句)只能看到查詢開始之前已經被提交的數據, 而無法看到未提交的數據或在查詢執行期間其它事務提交的數據。實際上,SELECT查詢看到的是一個在查詢開始運行的瞬間該數據庫的一個快照。不過SELECT可以看見在它自身事務中之前執行的更新的效果,即使它們還沒有被提交。
所以臟讀現象將不會再發生。
還要注意的是,即使在同一個事務里兩個相鄰的SELECT命令可能看到不同的數據,因為其它事務可能會在第一個SELECT開始和第二個SELECT開始之間提交。即會造成不可重復讀。
Repeatable read(可重復讀)
可重復讀隔離級別只看到在事務開始之前被提交的數據;它從來看不到未提交的數據或者並行事務在本事務執行期間提交的修改(不過,查詢能夠看見在它的事務中之前執行的更新,即使它們還沒有被提交)。
這個級別與讀已提交不同之處在於,一個可重復讀事務中的查詢可以看見在事務中第一個非事務控制語句開始時的一個快照,而不是事務中當前語句開始時的快照。因此,在一個單一事務中的后續SELECT命令看到的是相同的數據,即它們看不到其他事務在本事務啟動后提交的修改。