Как SQL server вставляет данные параллельно между приложениями?

#sql-server

#sql-server

Вопрос:

У меня есть два приложения. Данные непрерывно вставляются в базу данных, как будто у нее есть бесконечный цикл.

Что произойдет, когда второе приложение вставит данные в ту же базу данных и таблицу.

Если он ожидает, пока другое приложение завершит вставку, которая будет обрабатывать это?

Или он скажет, что занят?

Или код выдает исключение?

Комментарии:

1. Это зависит от нескольких факторов, например, есть ли у вас транзакция и каков ваш уровень изоляции, каков ваш кластеризованный индекс и какие данные вы вставляете. Вставки блокируют только минимальную часть таблицы, и если вторая вставка не вставляется в ту же часть, это будет сделано одновременно.

2. Не говоря уже о том, что вы отметили три разные СУБД. Ответ не будет одинаковым для всех из них.

3. О да, даже не посмотрел, есть ли что-то еще, кроме SQL Server, так что просто проигнорируйте мой комментарий, если вы работаете с чем-то другим — и отметьте только правильный.

Ответ №1:

У SQL-серверов есть нечто, называемое пулом соединений, что означает, что в любой конкретный момент времени может быть выполнено более одного подключения к базе данных, и на этом легкая часть заканчивается.

Если бы вы, например, подключались к базе данных в двух приложениях одновременно и вставляли данные в разные таблицы из каждого приложения, тогда оба могли бы счастливо произойти одновременно без проблем.

Если, однако, эти приложения хотели сделать что-то вроде редактирования одной и той же строки, тогда возникает проблема с «блокировкой»…

По сути, любая операция с базой данных SQL требует «получения блокировки» для «набора» или «строки» или «ячейки» в зависимости от конфигурации сервера, трудно сказать, что может произойти в вашем случае.

Итак, простой ответ: да, SQL может выполнять что-то (например, вставки) одновременно, но с некоторыми предложениями.

И длинный ответ … требуется глубокое знание блокировки и конфигурации вашей базы данных и сервера.

Комментарии:

1. Но здесь 1-е приложение вставляется непрерывно. Будет ли второе приложение вставлять в очередь или вставлять по времени поступления запроса.

2. это также зависит от таких вещей, как транзакции … каждый оператор выполняется как транзакция, которая помещается в «журнал транзакций», но если вы переносите операторы в транзакцию, все они фиксируются сразу или не фиксируются вообще. поэтому второму приложению, возможно, придется подождать, чтобы получить блокировку таблицы.