Gestion des transactions (XMLA)

Chaque commande XMLA (XML for Analysis) envoyée à une instance de Microsoft SQL Server Analysis Services s'exécute dans le contexte d'une transaction de la session implicite ou explicite active. Pour gérer chacune de ces transactions, vous devez utiliser les commandes BeginTransaction, CommitTransaction et RollbackTransaction. En utilisant ces commandes, vous pouvez créer des transactions implicites ou explicites, modifier le nombre de références de transaction, ainsi que les transactions de démarrage, de validation ou d'annulation.

Transactions implicites et explicites

Une transaction est soit implicite, soit explicite :

  • Transaction implicite
    Analysis Services crée une transaction implicite dans le cas d'une commande XMLA si la commande BeginTransaction ne spécifie pas le démarrage d'une transaction. Analysis Services valide toujours une transaction implicite si la commande aboutit et l'annule si la commande échoue.

  • Transaction explicite
    Analysis Services crée une transaction explicite si la commande BeginTransaction démarre une transaction. Toutefois, Analysis Services ne valide une transaction explicite que si une commande CommitTransaction est envoyée et l'annule si une commande RollbackTransaction est envoyée.

De plus, Analysis Services annule les transactions implicites et explicites si la session active se termine avant que la transaction active n'ait abouti.

Transactions et nombres de références

Analysis Services comptabilise le nombre de références de transaction pour chaque session. Toutefois, Analysis Services ne prend pas en charge les transactions imbriquées dans la mesure où une seule transaction active est gérée par session. Si aucune transaction n'est active dans la session active, le nombre de références de transaction est défini à zéro.

En d'autres termes, chaque commande BeginTransaction incrémente le nombre de références d'une unité, et chaque commande CommitTransaction décrémente le nombre de références d'une unité. Si une commande CommitTransaction définit le nombre de transactions à zéro, Analysis Services valide la transaction.

Cependant, la commande RollbackTransaction annule la transaction active quelle que soit la valeur actuelle du nombre de références de transaction. Autrement dit, une seule commande RollbackTransaction permet d'annuler la transaction active, quel que soit le nombre de commandes BeginTransaction ou CommitTransaction qui ont été envoyées, et définit le nombre de références de transaction à zéro.

Lancement d'une transaction

La commande BeginTransaction lance une transaction explicite sur la session active et incrémente son nombre de références de transaction d'une unité. Toutes les commandes suivantes sont considérées comme faisant partie de la transaction active, jusqu'à ce qu'un nombre suffisant de commandes CommitTransaction soit envoyé pour valider la transaction active ou qu'une commande unique RollbackTransaction soit envoyée pour annuler la transaction active.

Validation d'une transaction

La commande CommitTransaction valide les résultats des commandes exécutées après que la commande BeginTransaction a été exécutée sur la session active. Chaque commande CommitTransaction décrémente le nombre de références pour les transactions actives d'une session. Si une commande CommitTransaction définit le nombre de références à zéro, Analysis Services valide la transaction active. En l'absence de toute transaction active (c.-à.-d., le nombre de références de transaction pour la session active est déjà défini à zéro), une commande CommitTransaction provoque une erreur.

Annulation d'une transaction

La commande RollbackTransaction annule les résultats des commandes exécutées après que la commande BeginTransaction a été exécutée sur la session active. La commande RollbackTransaction annule la transaction active, quel que soit le nombre de références de transaction actuel, et définit le nombre de références de transaction à zéro. En l'absence de toute transaction active (c.-à.-d., le nombre de références de transaction pour la session active est déjà défini à zéro), une commande RollbackTransaction provoque une erreur.