DenisOgr
@DenisOgr
Developer

Как сделать обновление записи, которая ссылается на другую БД (которая в транзации в данный момент)?

Есть две базы данных: 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: прочитать я могу, обновить запись в таблице у которой есть внешнее поле ссылающее залоченно поле - не могу
  • Вопрос задан
  • 310 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы