Создание и управление индексами. Создание и управление встроенными процедурами. Оптимизация производительности запросов. Управление транзакциями и блокировками, страница 31

Сервер SQL поддерживает широкий набор механизмов контролирования конкуренцию.

15.2 Управление транзакциями

Существует две разновидности транзакций в SQL Server:

1.  Скрытые транзакции, каждый оператор, такой как INSERT, UPDATE или DELETE выполняется в транзакции;

2.  Явные транзакции объявленные пользователем – операторы, сгруппированные в BEGIN TRANSACTION и COMMIT TRANSACTION.

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

Транзакция сервера SQL может иметь следующий синтаксис:

BEGIN TRAN[SACTION] [transaction name | @transaction name variable [WITH MARK[‘description]]]

Опция Transaction name указывает имя транзакции определённое пользователем. Опция WITH MARK указывает что транзакция маркирована в журнале транзакций.

Синтаксис:

SAVE TRAN [ SACTION ] { savepoint_name | @savepoint_variable }

Синтаксис:

COMMIT [ TRAN [ SACTION ] [ transaction_name | @tran_name_variable ] ]

Возврат транзакции и контрольные точки

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

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

Рассуждения по использованию транзакций

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

*  Для уменьшения времени транзакции, будьте внимательны, когда используете различные операторы Transact-SQL, такие как WHILE, или DDL (Data Definition Language).

*  Не требуйте от пользователя ввода данных во время выполнения транзакции. Делайте ввод данных до начала выполнения транзакции.

*  Операторы INSERT, UPDATE и DELETE должны быть главными в транзакции и они должны быть написаны так, чтобы получать минимальный набор строк.

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

Установка опция не явных транзакций

В большинстве случаев, лучше объявлять транзакции явно с помощью оператора BEGIN TRANSACTION. Однако, для приложений, которые разрабатывались на системах отличных от SQL Server, оператор SET IMPLICIT_TRANSACTION может быть полезным. Он устанавливает режим неявной транзакции для соединения.

SET IMPLICIT_TRANSACTION {ON | OFF}

Рассматривайте следующие факты, когда вы устанавливаете неявные транзакции:

*  Когда режим неявной транзакции включён, выполнение любых из следующих операторов запускают транзакцию: ALTER TABLE, INSERT, CREATE, OPEN, DELETE, REVOKE, DROP, SELECT, FETCH, TRUNCATE TABLE, GRANT, UPDATE.

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

*  Когда установка включена, пользователь должен завершить или откатить транзакцию явно в конце транзакции.

*  Установка по умолчанию отключена.

Ограничения на транзакции определённые пользователем

Существуют некоторые ограничения на транзакции определённые пользователем:

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

o  ALTER DATABASE

o  BUCKUP LOG

o  CREATE DATABASE

o  DROP DATABASE

o  RECONFIGURE

o  RESTORE DATABASE

o  RESTORE LOG

o  UPDATE STATISTICS

15.3 Блокировки SQL Server