3

J'ai un tas de procédures utilitaires qui vérifient simplement certaines conditions dans la base de données et retournent un résultat de drapeau. Ces procédures sont exécutées avec le niveau d'isolation READ UNCOMMITTED, équivalent à WITH NOLOCK.Est-il acceptable si, à l'intérieur d'une procédure stockée, j'appelle une autre procédure qui établit un niveau d'isolation de transaction inférieur?

J'ai également des procédures plus complexes qui sont exécutées avec le niveau d'isolation SERIALIZABLE. Ils ont aussi le même genre de vérifications. J'ai donc décidé d'appeler ces procédures de vérification à partir de ces procédures complexes au lieu de répliquer le code de vérification.

Fondamentalement, il ressemble à ceci:

CREATE PROCEDURE [dbo].[CheckSomething] 
AS 
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

    BEGIN TRANSACTION 

    -- Do checks 

    COMMIT TRANSACTION 

et

CREATE PROCEDURE [dbo].[DoSomethingImportant] 
AS 
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 

    BEGIN TRANSACTION 

    EXECUTE [dbo].[CheckSomething] 

    -- Do some work 

    COMMIT TRANSACTION 

Serait-il correct de faire cela? Est-ce que le niveau d'isolation inférieur temporairement activé brise en quelque sorte la protection de niveau supérieur ou tout est-il parfait en toute sécurité?

EDIT: L'exécution se passe sans problème.

Répondre

5

Il est all here pour SQL Server 2005. Un extrait:

Lorsque vous modifiez une transaction d'un niveau d'isolement à l'autre, les ressources qui sont lus après le changement sont protégées selon les règles de le nouveau niveau. Les ressources qui sont lues avant que le changement continue à être protégé selon les règles de le niveau précédent. Par exemple, si une transaction est passée de READ COMMITTED à SERIALIZABLE, les verrouillages partagés acquis après le changement sont maintenant détenus jusqu'à la fin de la transaction .

Si vous émettez SET TRANSACTION ISOLEMENT LEVEL dans une procédure stockée ou déclencheur, lorsque l'objet retourne contrôle le niveau d'isolation est remis à zéro au niveau en vigueur lorsque l'objet a été invoqué. Par exemple, si vous définissez LIRE REPEATABLE dans un lot, et appelle ensuite lot une procédure stockée qui définit le réglage du niveau d'isolement à SERIALIZABLE, le niveau d'isolation revient à répétables LIRE lorsque la procédure stockée retourne contrôle à le lot.

Dans cet exemple:

  • Chaque niveau d'isolement est appliqué pour le champ d'application de la procédure stockée
  • ressources verrouillées par DoSomethingImportant rester sous SERIALIZABLE
  • Ressources utilisées par CheckSomething sont LIRE UNCOMMITTED
+0

Merci pour la clarification, quand je l'ai fait dans le passé, j'étais en dehors d'un proc stocké donc le comportement était différent t –

Questions connexes