Golang Postgres повторяемый уровень изоляции чтения не работает - PullRequest
0 голосов
/ 28 мая 2019

Мое понимание уровня изоляции транзакции 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;`)

Но все равно результаты те же.

1 Ответ

2 голосов
/ 28 мая 2019

Снимок транзакции REPEATABLE READ или SERIALIZABLE делается не во время запуска транзакции, а при выполнении первого оператора SQL внутри транзакции.

Во-первых, это оптимизация для случая, когда транзакция вообще не выполняет никаких операторов. Во-вторых, это единственный способ разрешить установку уровня изоляции транзакции после начала транзакции, но за до любой оператор SQL был выполнен с

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
...