Golang Postgres 可重复读取隔离级别不起作用
Golang Postgres repeatable read isolation level is not working
我对REPEATABLE READ
事务隔离级别的理解是,一旦设置,事务中读取的数据不会改变。我已经使用以下代码来验证这一点:
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;`)
但是结果还是一样
REPEATABLE READ
或 SERIALIZABLE
事务的快照不是在事务启动时拍摄的,而是在第一个 SQL 语句 运行 内交易。
首先,这是针对事务根本没有运行任何语句的情况的优化。其次,它是唯一允许设置事务隔离级别after事务开始的方法,但是before任何SQL语句已经 运行 和
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
我对REPEATABLE READ
事务隔离级别的理解是,一旦设置,事务中读取的数据不会改变。我已经使用以下代码来验证这一点:
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;`)
但是结果还是一样
REPEATABLE READ
或 SERIALIZABLE
事务的快照不是在事务启动时拍摄的,而是在第一个 SQL 语句 运行 内交易。
首先,这是针对事务根本没有运行任何语句的情况的优化。其次,它是唯一允许设置事务隔离级别after事务开始的方法,但是before任何SQL语句已经 运行 和
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;