2013-04-05 41 views
2

我注意到我的應用程序中存在奇怪的行爲。看起來提交後,提交的數據不可見。算法是這樣的:Postgresql提交的數據不可見

connection1 - insert into table row with id = 5 
connection1 - commit, close 
connection2 - open 
connection2 - select from table row with id = 5 (no results) 
connection2 - insert into table row with id = 5 (PRIMARY KEY VIOLATION, result is in db) 

如果選擇在連接2回報沒有結果的話,我就插入,否則更新。 服務器有許多數據庫(〜200),它看起來像提交已完成,但更改後在數據庫中。我使用java和jdbc。任何想法,將不勝感激。

+1

如果連接2的當前事務在連接1的事務提交之前啓動,它將無法看到更改 – 2013-04-05 09:34:20

+0

連接1在連接1提交後打開。 – Neuro 2013-04-05 11:51:32

+0

它真的是一個新鮮的連接,或者您正在使用連接池,如果連接池在邏輯連接上的close()後發生重置/清理,可能會出現錯誤行爲。 – 2013-04-05 12:05:56

回答

1

這種行爲對應於可重複讀隔離模式,請參閱SET TRANSACTION

重複讀
當前的事務只能看到 第一個查詢或者修改數據的語句 是之前的數據的所有聲明在此交易中執行。

嘗試connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED)看看它是否有所作爲。

+0

我的所有連接都有TRANSACTION_READ_COMMITTED隔離。 – Neuro 2013-04-05 11:52:11