В системе, работающей с базой данных 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>