我对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;`)
但结果仍然相同。
答案 0 :(得分:2)
REPEATABLE READ
或SERIALIZABLE
事务的快照不是在事务启动时获取的,而是在事务中第一个SQL语句运行时获取的。
首先,这是对事务根本不运行任何语句的情况的优化。其次,这是唯一允许在事务开始后 之后设置事务隔离级别的方法,但是在之前使用任何SQL语句运行
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;