3

鉴于这种情况:

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 执行期间提交更改

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

4

2 回答 2

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 中)

于 2013-04-09T20:45:10.933 回答
1

将事务隔离级别设置为可序列化。

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

于 2013-04-09T20:44:52.310 回答