保持SELECT不检索在事务开始后提交的行

Chr*_*ian 3 sql postgresql concurrency transactions isolation-level

鉴于这种情况:

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
Run Code Online (Sandbox Code Playgroud)

根据postgres文档:

另请注意,如果其他事务在执行第一个SELECT期间提交更改,则两个连续的SELECT命令可以看到不同的数据,即使它们位于单个事务中

问题是:如何避免SELECT在事务开始和查询开始之间提交行.

a_h*_*ame 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调用(例如,Connection.setTransactionIsolation()在Java/JDBC中)