Задать вопрос

Многопоточность и MySQL?

Как обстоят дела с многопоточностью в MYSQL? Есть одна таблица где есть id с автоинкрементом. Из приложения у которого два потока каждый открывает соединение с базой данных и inserit в эту таблицу. Как будет вести себя id? Или как подойти к этой проблеме? Создавать две таблицы как то не вариант. Синхронизировать тоже как то не очень. Хотя кажется последний единственное решение. Или на уровне бд есть своя синхронизация?
  • Вопрос задан
  • 7752 просмотра
Подписаться 7 Оценить Комментировать
Решения вопроса 2
@Joysi75
А в чем проблема?
Базу данных проблемы использующих ее приложений не волнуют. Она в порядке очереди будет обрабатывать поступающие запросы и выполнять их. При выполнении операций модификаций будет блокировать таблицу на изменение. Если будут параллельные запросы к данному ресурсу - положит их в очередь до завершение блокирующих операций, если параллельный запрос к незаблокированному ресурсу - запустит его выполнение не дожидаясь результатов предыдущих.

У вас таблица с identity. И одновременно поступило пятьсот insert-ов. Все они встанут в очередь. И будут отработаны (будут выполнены или нет из-за некорректности данных). Единственное но, если одно приложение послало подряд не в транзакции два insert-а, никто не гарантирует что у них idenitity поля после вставки будут отличаться на единицу.

И не стоит реализовывать в клиентской программе логику, например:
вы вставили значение в таблицу c identity ключом, получили его на клиенте и по привычке однопользовательской БД решили получить количество записей в таблице как значение idenity поля (при условии что данные из нее вы не удаляете) для дальнейших действий. Вот тут может не прокатить, так как между последней ВАШЕЙ операцией Insert может кто-то еще вставить данные и вы не учтете их в логике приложения.

P.S.
Также помните, если вам надо выполнить в базе данных подряд несколько логически связанных операций , то оформите их как транзакцию - логический неделимый блок операций. При этом операции будут выполнены подряд последовательно, результат будет:
-отражен в БД данных при условии , что все операции выполнены корректно
-полностью отменен и БД восстановит состояние, в котором она была до выполнения первой операции в транзакции при условии, что какое либо действие в транзакции не исполнилось.
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Id будет уникальным, как ему и положено. Он резервируется через мьютекс и если INSERT не удался, то этот id будет пропущен.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@vilgeforce
Раздолбай и программист
А нужна ли вам синхронизация вообще? Пускай пишут себе в базу как придется, раз чтения нет.
Ответ написан
Комментировать
foxmuldercp
@foxmuldercp
Системный администратор, программист, фотограф
Логика базы данных и логика приложения - два разных уровня и две разные каши. И не стоит их смешивать в кучу.
Приложение не должно думать об уровне базы данных, это НЕ его забота.
Уровень идентификации ресурса в БД - дело исключительно БД.
В принципе, в любой ORM это будет видно.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
22 дек. 2024, в 20:40
10000 руб./за проект
22 дек. 2024, в 20:34
3000 руб./за проект
22 дек. 2024, в 20:12
10000 руб./за проект