Как добиться согласованного чтения через несколько 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 ответ

Решение

С участием SELECTs в одной транзакции сREPEATABLE READвы должны видеть те же данные и не видеть никаких изменений, внесенных другими транзакциями. Да, данные могут быть изменены другими транзакциями, но во время транзакции вы работаете с представлением и не видите изменений. Так что это последовательно.

Чтобы убедиться, что данные фактически не изменяются между выборами, единственный способ - заблокировать таблицы / строки, то есть с помощью SELECT FOR UPDATE- но так быть не должно. Транзакции должны быть короткими / быстрыми, а блокировка таблиц / предотвращение обновлений, в то время как какая-то длинная цепочка запусков выборок, очевидно, не подходит.


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

Изоляция транзакции влияет на то, как следует обрабатывать эффекты этой и других транзакций, происходящих в один и тот же момент. Википедия

С уровнем изоляции REPEATABLE READ(которые, кстати, реплики Aurora для Aurora MySQL всегда используются для операций с таблицами InnoDB), вы работаете с представлением чтения базы данных и видите только данные, переданные ранееBEGIN сделки.

Это значит, что SELECTs в одной транзакции будут видеть те же данные, даже если изменения были внесены другими транзакциями.

Для сравнения, с уровнем изоляции транзакции READ COMMITTED последующие выборки в одной транзакции могут видеть разные данные, которые были зафиксированы между ними другими транзакциями.