Поделиться через


Управление транзакциями (XMLA)

Каждая команда XML для аналитики (XMLA), отправляемая экземпляру служб MicrosoftSQL ServerAnalysis Services, выполняется в контексте транзакции в рамках текущего явного или неявного сеанса. Для управления каждой из этих транзакций используются команды BeginTransaction, CommitTransaction и RollbackTransaction. При помощи этих команд можно создавать явные или неявные транзакции, изменять счетчик ссылок транзакции, а также запускать, фиксировать или откатывать транзакции.

Явные и неявные транзакции

Транзакция является либо неявной либо явной:

  • Неявная транзакция
    Службы Analysis Services создают неявную транзакцию для команды XMLA, если команда BeginTransaction не указывает запуск транзакции. Службы Analysis Services всегда фиксируют неявную транзакцию, если команда завершается успешно, и откатывают ее, когда команда завершается неудачей.

  • Явная транзакция
    Службы Analysis Services создают явную транзакцию, если команда BeginTransaction запускает транзакцию. При этом службы Analysis Services фиксируют явную транзакцию только, если отправлена команда CommitTransaction, и откатывают ее, если отправлена команда RollbackTransaction.

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

Транзакции и счетчики ссылок

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

Другими словами, каждая команда BeginTransaction увеличивает счетчик ссылок на один, а каждая команда CommitTransaction уменьшает его на один. Если команда CommitTransaction устанавливает счетчик транзакций в нуль, службы Analysis Services фиксируют транзакцию.

При этом команда RollbackTransaction откатывает активную транзакцию без учета текущего значения счетчика ссылок транзакций. Другими словами, одна команда RollbackTransaction откатывает активную транзакцию независимо от того, сколько было отправлено команд BeginTransaction или CommitTransaction, и устанавливает счетчик ссылок транзакции в нуль.

Запуск транзакции

Команда BeginTransaction начинает явную транзакцию в рамках текущего сеанса и увеличивает счетчик ссылок транзакции для текущего сеанса на один. Считается, что все последующие команды выполняются в рамках активной транзакции, либо пока ни будет отправлено достаточное количество команд CommitTransaction, чтобы зафиксировать транзакцию, либо пока ни будет отправлена одна команда RollbackTransaction, чтобы откатить активную транзакцию.

Фиксация транзакции

Команда CommitTransaction фиксирует результаты команд, выполняемых после того, как в рамках текущего сеанса была выполнена команда BeginTransaction. Каждая команда CommitTransaction уменьшает счетчик ссылок транзакции для активной транзакции в рамках сеанса. Если команда CommitTransaction устанавливает счетчик транзакций в нуль, службы Analysis Services фиксируют активную транзакцию. Если отсутствуют активные транзакции (то есть счетчик ссылок на транзакции в текущем сеансе уже имеет нулевое значение), команда CommitTransaction вызывает ошибку.

Откат транзакции

Команда RollbackTransaction откатывает результаты команд, выполняемых после того, как в рамках текущего сеанса была выполнена команда BeginTransaction. Команда RollbackTransaction откатывает активную транзакцию независимо от значения счетчика ссылок транзакции, и устанавливает счетчик ссылок транзакции в нуль. Если отсутствуют активные транзакции (то есть счетчик ссылок на транзакции в текущем сеансе уже имеет нулевое значение), команда RollbackTransaction вызывает ошибку.