#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