Использовать транзакции для инструкций select?

#sql-server #tsql #stored-procedures

#sql-сервер #tsql #хранимые процедуры

Вопрос:

Я не очень часто использую хранимые процедуры, и мне было интересно, имеет ли смысл включать мои запросы select в транзакцию.

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

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

1. возможно, первому оператору не обязательно присутствовать в транзакции

Ответ №1:

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

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

Обновление : Вам также может показаться интересной эта статья о решениях для одновременного обновления / вставки (aka upsert). Это подвергает тестированию несколько распространенных методов upsert, чтобы увидеть, какой метод на самом деле гарантирует, что данные не будут изменены между операторами select и next. Результаты, ну, я бы сказал, шокирующие.

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

1. Я использовал service broker для высококонкурентной службы с аналогичным случаем и столкнулся с проблемой взаимоблокировки sql при большом объеме. Применение этого предложения и, особенно упомянутой статьи выше устранило все взаимоблокировки — спасибо 🙂

Ответ №2:

Транзакции обычно используются, когда у вас есть инструкции CREATE , UPDATE или DELETE и вы хотите иметь атомарное поведение, то есть либо фиксировать все, либо ничего не фиксировать.

Однако вы могли бы использовать транзакцию для READ инструкций select, чтобы:
Убедитесь, что никто другой не смог обновить интересующую таблицу во время выполнения связки вашего запроса select.

Взгляните на это сообщение msdn.

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

1. Вы прочитали вашу ссылку? An application can perform actions such as acquiring locks to protect the transaction isolation level of SELECT statements Это хороший вариант использования для этого, поскольку в OP указано, что они используют результаты одного select в качестве параметров в последующих запросах.

Ответ №3:

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

PostgreSQL фактически обрабатывает каждую инструкцию SQL как выполняемую в транзакции. Если вы не выполняете команду BEGIN, то каждая отдельная инструкция имеет неявный BEGIN и (в случае успеха) COMMIT, обернутый вокруг нее. Группу инструкций, окруженных BEGIN и COMMIT, иногда называют блоком транзакции.

https://www.postgresql.org/docs/current/tutorial-transactions.html