#sql-server
#sql-server
Вопрос:
У меня есть два приложения. Данные непрерывно вставляются в базу данных, как будто у нее есть бесконечный цикл.
Что произойдет, когда второе приложение вставит данные в ту же базу данных и таблицу.
Если он ожидает, пока другое приложение завершит вставку, которая будет обрабатывать это?
Или он скажет, что занят?
Или код выдает исключение?
Комментарии:
1. Это зависит от нескольких факторов, например, есть ли у вас транзакция и каков ваш уровень изоляции, каков ваш кластеризованный индекс и какие данные вы вставляете. Вставки блокируют только минимальную часть таблицы, и если вторая вставка не вставляется в ту же часть, это будет сделано одновременно.
2. Не говоря уже о том, что вы отметили три разные СУБД. Ответ не будет одинаковым для всех из них.
3. О да, даже не посмотрел, есть ли что-то еще, кроме SQL Server, так что просто проигнорируйте мой комментарий, если вы работаете с чем-то другим — и отметьте только правильный.
Ответ №1:
У SQL-серверов есть нечто, называемое пулом соединений, что означает, что в любой конкретный момент времени может быть выполнено более одного подключения к базе данных, и на этом легкая часть заканчивается.
Если бы вы, например, подключались к базе данных в двух приложениях одновременно и вставляли данные в разные таблицы из каждого приложения, тогда оба могли бы счастливо произойти одновременно без проблем.
Если, однако, эти приложения хотели сделать что-то вроде редактирования одной и той же строки, тогда возникает проблема с «блокировкой»…
По сути, любая операция с базой данных SQL требует «получения блокировки» для «набора» или «строки» или «ячейки» в зависимости от конфигурации сервера, трудно сказать, что может произойти в вашем случае.
Итак, простой ответ: да, SQL может выполнять что-то (например, вставки) одновременно, но с некоторыми предложениями.
И длинный ответ … требуется глубокое знание блокировки и конфигурации вашей базы данных и сервера.
Комментарии:
1. Но здесь 1-е приложение вставляется непрерывно. Будет ли второе приложение вставлять в очередь или вставлять по времени поступления запроса.
2. это также зависит от таких вещей, как транзакции … каждый оператор выполняется как транзакция, которая помещается в «журнал транзакций», но если вы переносите операторы в транзакцию, все они фиксируются сразу или не фиксируются вообще. поэтому второму приложению, возможно, придется подождать, чтобы получить блокировку таблицы.