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 :

Empêcher la lecture d'une table pendant une transaction ?


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 17
    Points : 21
    Points
    21
    Par défaut Empêcher la lecture d'une table pendant une transaction ?
    Bonjour à tous.

    Je vous explique mon soucis, j'ai une transaction qui lit la dernière entrée dans une table puis qui insère une nouvelle ligne avec une nouvelle valeur.

    Je vais prendre un exemple ça sera plus parlant, admettons que ma transaction a le comportement suivant : select de la derniere valeur dans ma table puis insert dans cette meme table de la valeur lue moins 200.

    En cas d'action simultanée, j'ai le problème suivant :
    si le solde est disons de 1000.

    requete 1 :
    select => 1000
    requete 2 :
    select => 1000
    requete 1 :
    insert => 800
    requete 2 :
    insert => 800

    alors que j'aimerai avoir quelque chose de ce type plutôt :
    requete 1 :
    select => 1000
    insert => 800
    requete 2 :
    select => 800
    insert => 600


    J'aimerai que pendant cette transaction, il ne soit pas possible de lire les données de cette table.
    J'ai essayer avec TABLOCKX, et à priori ça résout mon soucis, par contre, je ne sais pas si c'est une solution propre ou sûre.

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Vous pouvez utiliser le niveau de transaction SERIALIZABLE avec la commande suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    Le mieux étant de laisser faire SQL Server, qui s'en dépatouille très bien.

    @++

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 17
    Points : 21
    Points
    21
    Par défaut
    Merci.

    J'ai essayer avec un exemple trouvé sur ce site.

    J'ai créer une table DB_ISO_LEVEL avec 2 champs : clé primaire en auto_increment et une valeur de type int.

    j'ai entré les valeurs 1, 2 et 3 dans la base.

    Lorsque j'exécute le code suivant simultanément :

    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
    USE DB_ISO_LEVEL
    GO
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    BEGIN TRANSACTION TRAN1
    DECLARE @LAST INT
    SELECT top 1 @LAST = COL
    FROM T_ISO
    order by COL desc
     
    WAITFOR DELAY '00:00:03'
    set @LAST = @LAST + 1
    insert T_ISO values(@LAST)
     
    COMMIT TRANSACTION
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED
    USE master
    GO
    J'ai systématiquement un deadlock, ce n'est pas non plus le comportement que je recherche.

Discussions similaires

  1. copier une table d'une BDD dans une table d'une autre BDD
    Par faniette dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/05/2013, 10h17
  2. Réponses: 1
    Dernier message: 19/10/2011, 12h13
  3. Réponses: 7
    Dernier message: 25/03/2011, 10h52
  4. [AC-2003] insert des données d'une table dans une table d'une base externe
    Par marieo dans le forum VBA Access
    Réponses: 1
    Dernier message: 30/11/2009, 14h29
  5. Copier les enregistrements d'une table vers une table d'une autre DB
    Par karinette21 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 18/11/2008, 21h50

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