2013-04-05 72 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