SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL SERIALIZABLE;
set default_transaction_isolation='repeatable read';
set transaction isolation level repeatable read;
show transaction_isolation;
設置默認的隔離級別,缺省的為read committed.
postgres=# set default_transaction_isolation='repeatable read';
postgres=# show transaction_isolation;
transaction_isolation
-----------------------
repeatable read
read committed,提交讀,oltp
postgres=# show transaction_isolation;
transaction_isolation
-----------------------
read committed
repeatable read,可重復讀,做報表
即一個事務中,所有的select讀取的結果是一樣,即都讀同一個時間點上的數據。
相當於 select * from as tabName as scn=12345;
要注意的有同一行,補兩個事務更新,被阻塞者是repeatable read事務,那么阻塞者提交后,被阻塞者將收到如下錯誤:
ERROR: could not serialize access due to concurrent update
如果阻塞者回退執行了回退,則持有repeatable read事務的被阻塞者也不會報錯。
postgres=# begin;
postgres=# set transaction isolation level repeatable read;
postgres=# show transaction_isolation;
transaction_isolation
-----------------------
repeatable read
postgres=# commit;
postgres=# show transaction_isolation;
transaction_isolation
-----------------------
read committed
串行讀 SERIALIZABLE read
嚴格來說,PostgreSQL在9.1之前的版本中只是實現了其中兩種,即讀已提交和串行讀。
在PostgreSQL v9.1的版本中提供了三種實現方式,即在原有的基礎上增加了可重復讀。但串行讀與可重復讀測試目前沒有差別。
不過使用MVCC機制實現的數據庫隔離級別和傳統鎖機制實現的數據庫的隔離級別有細微的差異。
