Как добиться согласованного чтения через несколько SELECT с помощью AWS RDS DataService (Aurora Serverless)
Я не уверен, как добиться единообразного чтения через несколько SELECT
запросы.
Мне нужно запустить несколько SELECT
запросов и убедиться, что между ними нет UPDATE
, DELETE
или CREATE
изменила общую согласованность. Лучшим случаем для меня, конечно же, будет что-нибудь неблокирующее.
Я использую MySQL 5.6 с InnoDB и по умолчанию REPEATABLE READ
уровень изоляции.
Проблема в том, что я использую RDS DataService beginTransaction
с несколькими executeStatement
(с предоставленным transactionId
). Я НЕ получаю полный результат в конце при звонкеcommitTransaction
.
В commitTransaction
только дает мне { transactionStatus: 'Transaction Committed' }
..
Я не понимаю, разве функция транзакции фиксации не должна давать мне все (из многих SELECT
) результат набора данных?
Вместо этого даже с transactionId
, каждый executeStatement
возвращает мне индивидуальный результат... Очевидно, что такое поведение НЕ соответствует..
1 ответ
С участием SELECT
s в одной транзакции сREPEATABLE READ
вы должны видеть те же данные и не видеть никаких изменений, внесенных другими транзакциями. Да, данные могут быть изменены другими транзакциями, но во время транзакции вы работаете с представлением и не видите изменений. Так что это последовательно.
Чтобы убедиться, что данные фактически не изменяются между выборами, единственный способ - заблокировать таблицы / строки, то есть с помощью SELECT FOR UPDATE
- но так быть не должно. Транзакции должны быть короткими / быстрыми, а блокировка таблиц / предотвращение обновлений, в то время как какая-то длинная цепочка запусков выборок, очевидно, не подходит.
Выпущенные запросы к базе данных выполняются в момент их отправки. Результат запросов останется незафиксированным до фиксации. Запрос может быть заблокирован, если он нацелен на ресурс, заблокированный другой транзакцией. Запрос может завершиться ошибкой, если другой ресурс изменил транзакцию, что привело к конфликту.
Изоляция транзакции влияет на то, как следует обрабатывать эффекты этой и других транзакций, происходящих в один и тот же момент. Википедия
С уровнем изоляции REPEATABLE READ
(которые, кстати, реплики Aurora для Aurora MySQL всегда используются для операций с таблицами InnoDB), вы работаете с представлением чтения базы данных и видите только данные, переданные ранееBEGIN
сделки.
Это значит, что SELECT
s в одной транзакции будут видеть те же данные, даже если изменения были внесены другими транзакциями.
Для сравнения, с уровнем изоляции транзакции READ COMMITTED
последующие выборки в одной транзакции могут видеть разные данные, которые были зафиксированы между ними другими транзакциями.