IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

[SQL] Transaction SQL


Sujet :

MS SQL Server

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 7
    Points
    7
    Par défaut [SQL] Transaction SQL
    Bonjour,
    un de mes dév à coder un truc un peu bizarre !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    BEGIN
            BEGIN TRANSACTION
            SELECT @w = isnull(INFO_LINK2, 0)
            FROM   toto (ROWLOCK)
            WHERE  ID = @id
            IF @w = 0
            BEGIN
                    UPDATE toto
                    SET    INFO = 50
                    WHERE  ID = @id
                    COMMIT TRANSACTION
                    SELECT @ostatus = 0
            END
            ELSE
            BEGIN
                    ROLLBACK TRANSACTION
                    SELECT @oStatus = 2
            END      
    END
    La modification que j'ai en tête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    BEGIN        
      -- BEGIN TRANSACTION
      UPDATE toto
         SET INFO = 50
       WHERE  ID = @id
         AND isnull(INFO, 0) = 0
      SET @r= @@ROWCOUNT
      -- COMMIT TRANSACTION
     IF @R>0
       SELECT @ostatus = 0
     ELSE
       SELECT @oStatus = 2
    END
    Mes questions sont les suivantes :
    Mon code peut-il remplacer le code T-Sql que mon chère dév à écrit ?
    Y a t-il correspondance entre les 2 codes en terme transactionnel ?
    Pourquoi verrouiller un enregistrement puis le mettre à jour (cas du 1 code) alors qu'un simple update peut suffire ?

    Merci

  2. #2
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Bonjour,

    Le but de ton développeur est de garder un verrou sur la ligne pour update. Le problème est que, en isolation read committed par défaut, cela ne marchera pas avec le premier code : le verrou est libéré après le SELECT.

    Ton deuxième code est correct (à part une typo sur INFO). Evite simplement le passage de ta colonne dans la fonction, pour raisons de performances :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      UPDATE toto
         SET INFO = 50
       WHERE  ID = @id
         AND (INFO_LINK2 = 0 OR INFO_LINK2 IS NULL)

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 850
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 850
    Points : 52 984
    Points
    52 984
    Billets dans le blog
    6
    Par défaut
    Plus simple encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE toto
         SET INFO = 50,
             @r= = CASE
                       WHEN NULL THEN 0
                       ELSE           2
                   END
       WHERE  ID = @id
         AND (INFO_LINK2 = 0 OR INFO_LINK2 IS NULL)
    A +

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Merci à tous pour vos commentaires.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Le case dans l'update, ça fonctionne ?
    J'ai essayé sous SQL 2000 et 2005.
    Sous 2005, j'ai le message d'erreur :
    Msg 4145, Level 15, State 1, Line 12
    An expression of non-boolean type specified in a context where a condition is expected, near 'THEN'.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [T-SQL]Transact SQL vs PLSQL
    Par MouMouh dans le forum Sybase
    Réponses: 7
    Dernier message: 05/10/2011, 23h06
  2. [PL/SQL][Transact SQL]
    Par MouMouh dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/12/2005, 12h02
  3. Conversion de SQL à Transact-SQL
    Par sebioni dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/07/2003, 11h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo