Есть две базы данных: DB1, DB2.
А этих БД есть по таблице: DB1.groups[id, name] и DB2.keywords[id, name, group_id].
DB1.groups.id - это внешний ключ для DB2.keywords.group_id
Задача такая: получить данные -> обработать -> обновить DB1.groups -> обновить DB2.keywords.
Псевдокод реализации:
//begin transaction for DB1;
begin_transaction('db1');
try {
$a = get_data()
$a = handle1($a);
insert_to_db1($a);
insert_to_db2($a); // вот тут и происходит завис запроса и ошибкой “Lock wait timeout exceeded; try restarting transaction”
commit_transaction('db1');
} catche(\Exception $e) {
rollback_transaction('db1');
}
Причина в том, что я залочил транзацией базу DB1 и при обновлении таблицы во второй базе DB2 она зависает потому что у меня есть в ней внешний ключ на залоченную базу DB1(запрос ждет когда разлочится DB1). Если убрать внешний ключ - то все быстро выполняется.
Как поступить? Я понимаю что транзакции атомарны для одной бд, но у меня в задачи мало быть атомарной для одной бд.
Внешние ключи убирать не буду. Без транзации стремно использовать.
Кто как решатет проблему.
Из технологий: php mysql yii2
PS 1:
Спаисбо Оптимус Пьян, залоченна не бд и не таблица, а только та запись, которою аплейтил. Смысл же как раз и в том, что если изменилась запись в первой таблице - менять ее во второй.
Как решение написть триггер на событие: AFTER_UPDATE первой таблице, но это работы с разными БД и вторая БД может иметь разное название....
PS2:
прочитать я могу, обновить запись в таблице у которой есть внешнее поле ссылающее залоченно поле - не могу