2013-04-09 24 views
3

開始後COMMITED行:請選擇檢索鑑於這種情況下交易

TIME TRANSACTION 1    TRANSACTION 2 
1sec BEGIN 
2sec INSERT RECORDS INTO T1 
3sec (doing other things)  BEGIN 
4sec (doing other things)  (doing other things) 
5sec COMMIT     (doing other things) 
6sec       SELECT * FROM T1 <<- GETS ROWS INSERTED BY T1 

據Postgres的文檔:

還要注意的是兩個連續的SELECT命令可以看到不同的數據, 即使它們在單個交易中,但如果其他 交易在第一個選擇執行期間提交更改

問題是:如何避免SELECT在事務開始和查詢開始之間獲取行提交。

回答

5

您所描述的情況被稱爲「幻象」,是不可能的,當您使用防止了這種像REPEATABLE READSERIALIZABLE的隔離級別。

http://www.postgresql.org/docs/current/static/transaction-iso.html

可以使用SET TRANSACTION命令更改隔離級別:

http://www.postgresql.org/docs/current/static/sql-set-transaction.html

根據您使用連接到數據庫的接口上,你也許還可以使用相應的API調用(例如,Java/JDBC中的Connection.setTransactionIsolation()