mysql / aurora не сразу видит результаты совершенных транзакций - PullRequest
0 голосов
/ 25 сентября 2019

В системе, работающей с базой данных AWS aurora-mysql, выполняется следующий (очевидно, чрезвычайно упрощенный) код.Это высококонкурентная система (написанная на Java, если это имеет значение) с несколькими потоками, несколькими подключениями к БД.Проблема, с которой мы сталкиваемся, заключается в том, что два потока пытаются одновременно вставить 'abc' в таблицу.

Как и ожидалось, если thread1 и thread2 запускаются одновременно, thread2 застреваетожидание оператора "выбрать ... для обновления" в начале.Как только поток1 завершает свою транзакцию, блокировка снимается, и поток2 продолжает выполняться.

Проблема в том, что следующая строка, выбранная потоком 2 из tbl_foo, не возвращает результата, после чего он выполняет неправильный блок кода, несмотря на то, что он только что был вставлен.Фактически, последующая вставка потоком 2 завершится неудачей из-за нарушения уникального ограничения, поэтому он «знает», что строка есть.Это известная проблема с кэшированием чтения mysql и / или aurora?Есть ли какие-то настройки конфигурации, которые это изменят?

<start transaction>

SELECT * FROM tbl_user WHERE userID = 123 FOR UPDATE;

SELECT * FROM tbl_foo WHERE fk_user = 123 AND unique_column = 'abc';

if (found row in tbl_foo)
    do stuff
else
    do different stuff including inserting (123, 'abc') into tbl_foo

<commit transaction>

1 Ответ

0 голосов
/ 26 сентября 2019

должно быть связано с isolation-level

Пожалуйста, проверьте уровень изоляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...