постановка нескольких запросов SQL в одну строку, поведение сервера? - PullRequest
0 голосов
/ 16 июля 2011

Когда у вас есть, например.3 запроса подряд, которые вы отправляете в базу данных SQL в виде одной строки, разделенных точками с запятой, и другой пользователь делает то же самое одновременно, наши запросы будут рассматриваться как «группа» или «очередь» запросовкоторый всегда будет выполняться в одном и том же логическом порядке для каждого пользователя, или может очередь этих запросов «запутаться», в результате чего оба наших запроса будут выполняться один за другим?

Так что в основном я хочу знать,в какой из следующих ситуаций и MySQL, и SQL Server будут вести себя так:

  • ситуация пути выполнения 1 :

  • запрос пользователя 1, запрос пользователя 1, запрос пользователя 1, запрос пользователя 2, запрос пользователя 2, запрос пользователя 2, запрос пользователя 2 3

  • ситуация пути выполнения2 :

  • запрос пользователя 1, запрос пользователя 2, запрос пользователя 1, запрос 2 пользователя 2, запрос пользователя 3, запрос пользователя 2, запрос 3

Ответы [ 3 ]

1 голос
/ 16 июля 2011

Это зависит от того, видит ли ваша база данных это как несколько отдельных запросов или как одну транзакцию.Если он видит это как транзакцию, заказ не имеет значения.Если вы хотите убедиться, что он воспринимает это как одну транзакцию, есть способы сообщить базе данных, что она должна создать транзакцию для ваших запросов.База данных (должна) обеспечивать четыре основных свойства (ACID):

  • Атомная - вся транзакция завершается успешно или неуспешно.
  • Состоит - База данных всегда будет оставаться в согласованном состоянии,независимо от того, успешна ли транзакция или нет.
  • Изолированный - Несколько обрабатываемых транзакций одновременно не могут мешать друг другу.
  • Долговечный - База данных должна быть в состояниивосстановить зафиксированные данные после программных и аппаратных сбоев.

Изоляция - это то, что относится к вашему делу.Ваши запросы не должны саботировать запросы другого человека, поэтому вам не нужно беспокоиться о том, что другие пользователи одновременно отправляют запросы.

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

В целях безопасности я бы начал ваш запрос с BEGIN TRANSACTION и завершил бы его COMMIT TRANSACTION (или любым другим синтаксисом, необходимым вашей базе данных).Если база данных воспринимает это как несколько отдельных запросов, у вас могут возникнуть проблемы, если они выполнят какую-либо запись в базу данных.Лучше всего использовать транзакцию.

1 голос
/ 16 июля 2011

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

0 голосов
/ 16 июля 2011

Для SQL Server запросы для определенного пользователя будут выполняться в указанном порядке, но они могут чередоваться с инструкциями других пользователей, в зависимости от того, когда ресурсы станут доступны.Внутри транзакции вы можете гарантировать непротиворечивость данных, но ваши утверждения могут потенциально чередоваться с утверждениями других пользователей.Типы используемых вами операторов и блокировок будут определять, могут ли другие операторы получать доступ к тем же таблицам и строкам, с которыми вы работаете в своих запросах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...