【问题标题】:Keep SELECT from retrieving rows commited after the start of the transaction阻止 SELECT 检索事务开始后提交的行
【发布时间】:2013-04-01 11:35:38
【问题描述】:

鉴于这种情况:

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 在事务开始和查询开始之间提交行。

【问题讨论】:

    标签: sql postgresql concurrency transactions isolation-level


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您描述的情况称为“幻读”,当您使用像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()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-02
        • 2016-08-21
        • 1970-01-01
        相关资源
        最近更新 更多