@immelnikoff
Изучаю БД

Как синхронизировать выгрузку данных из приложения на удаленный сервер MySQL?

Есть таблица
CREATE TABLE t1(
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
link CHAR(36) NOT NULL UNIQUE
);


Внешнее приложение (1С:Предприятие) пишет в эту таблицу через функцию:
CREATE FUNCTION insert_t1 (_link char(36)) RETURNS INT UNSIGNED
BEGIN
INSERT INTO t1(link) VALUE(_link);
RETURN LAST_INSERT_ID();
END

Эта функция возвращает сгенерированный id. Проблема в том, что иногда случается так, что запись в таблицу делается, а приложение не получает обратно сгенерированный id. В итоге, приложение пытается повторно сделать запись, из-за чего возникает ошибка из-за дубля уникального ключа.
Как избежать таких неприятностей? С помощью транзакции? Но, как я понимаю, она тут не поможет. Возвращаемый id после успешного выполнения транзакции может потеряться где-нибудь в сети и не дойти до приложения. Или я ошибаюсь?
  • Вопрос задан
  • 93 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Вставляйте через INSERT IGNORE, тогда не будет дублирования. Затем делайте SELECT по link и возвращайте полученный id.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Генерируйте уникальный ключ на клиенте, с сервера получайте не id, а подтверждение записи. Если получено не было, отправляйте запрос заново, но уже что то вроде insert or select, а сервер пусть возвращает успех если запись найдена или пытается записать.
Для ключа сделайте специальное поле в таблице с UNIQUE INDEX.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы