@chetupek

Правильно ли отработает такая транзакция?

Привет!
Есть 2 базы, одна рабочая, другая временная. Время от времени мне нужно переносить данные из временной в рабочую и чистить временную базу.
Для этого я хочу использовать подобный запрос:
START TRANSACTION;
	INSERT INTO 
		chat_lastread(`user_id`, `dialog_id`, `date`)
	SELECT
		`user_id`, `dialog_id`, `date`
	FROM
		chat_lastread_temp 
	ON DUPLICATE KEY UPDATE 
		chat_lastread.`date` = chat_lastread_temp.`date`;
	
	DELETE FROM chat_lastread_temp;
COMMIT;

Правильно ли я поступаю?
Если между запросами INSERT FROM SELECT и DELETE в chat_lastread_temp будет вставлена строка, то она будет потеряна или транзакция этого не допустит?

Мне нужно удалить из chat_lastread_temp только те строки, которые были перенесены в chat_lastread во время этой транзакции, нужно что бы ничего не потерялось

Если нет, то как сделать все правильно?

Спасибо!
  • Вопрос задан
  • 67 просмотров
Решения вопроса 1
@dkfancska
При работе с транзакциями - принцип все или ничего. Выполнится вся инструкция или ничего не выполнится
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Если между запросами INSERT FROM SELECT и DELETE в chat_lastread_temp будет вставлена строка, то она будет потеряна или транзакция этого не допустит?

Зависит от ENGINE таблицы chat_lastread_temp.
В InnoDB - данные могут быть легко потеряны, у вас нет какой-то блокировки.
Опять же блокировка работает по индексу, т.е не препятствует вставке новых записей.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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