【问题标题】:Golang Postgres repeatable read isolation level is not workingGolang Postgres 可重复读取隔离级别不起作用
【发布时间】:2019-05-28 07:53:03
【问题描述】:

我对@9​​87654321@事务隔离级别的理解是,一旦设置了,事务中读通的数据就不会改变。我已经使用以下代码来验证这一点:

ctx = context.Background()
tx, _ := db.BeginTx(ctx, &sql.TxOptions{Isolation: sql.LevelSerializable}) 
time.Sleep(5 * time.Second)
// do query on tx

当进程处于休眠状态时,我通过控制台插入了另一条记录。但是新插入的记录已经出现在结果中。为什么呢?我不想阅读事务开始后插入的记录。我也试过了:

tx, _ := db.Begin()
_, err = tx.Exec(`set transaction isolation level repeatable read;`)

但结果还是一样。

【问题讨论】:

    标签: postgresql go transactions isolation-level acid


    【解决方案1】:

    REPEATABLE READSERIALIZABLE 事务的快照不是在事务启动时拍摄,而是在第一条 SQL 语句在事务内运行时拍摄。

    首先,这是针对事务根本不运行任何语句的情况的优化。其次,它是允许在事务开始之后设置事务隔离级别的唯一方法,但之前任何SQL语句已经运行

    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
    

    【讨论】:

    • 我希望是BEGIN ISOLATION LEVEL SERIALIZABLE,它会在事务启动时设置隔离级别。
    猜你喜欢
    • 1970-01-01
    • 2017-04-14
    • 2020-08-18
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多