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

ASP.NET MVC Discussion :

Gestion d'un conflit lors d'une réservation


Sujet :

ASP.NET MVC

  1. #1
    Membre du Club
    Homme Profil pro
    informatique de gestion
    Inscrit en
    Janvier 2011
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : informatique de gestion

    Informations forums :
    Inscription : Janvier 2011
    Messages : 92
    Points : 67
    Points
    67
    Par défaut Gestion d'un conflit lors d'une réservation
    Bonjour à tous et à toutes ..
    Voici mon problème, je souhaite gérer un conflit lors d'une réservation.
    Cas :
    JE dispose de plusieurs tables
    Une table emplacement qui contient les emplacements de parking, le champ PlaceFor est là pour indiquer si il s'agit d'une reservation ou d'un abonnement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE [dbo].[Emplacement](
    	[EmplacementId] [int] IDENTITY(1,1) NOT NULL,
    	[ParkingId] [int] NOT NULL,
    	[Status] [bit] NOT NULL,
    	[num] [int] NOT NULL,
    	[PlaceFor] [char](1) NULL,)
    D'une table réservation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE [dbo].[Reservation](
    	[ReservationId] [int] IDENTITY(1,1) NOT NULL,
    	[StartDate] [datetime2](7) NOT NULL,
    	[EndDate] [datetime2](7) NOT NULL,
    	[EmplacementId] [int] NOT NULL,
    	[ClientId] [int] NOT NULL
    )
    Mon problème est le suivant.
    J'aimerais gérer en asp.net MVC le cas suivant.
    Disons qu'il ne reste qu'une place est que 2 personnes soient connectées en même temps sur mon site à la recherche d'un emplacement?
    Je voudrais gérer le conflit entre les 2 c'est à dire attribuer la dernière place restante à la première personne qui aura validée son choix.
    Merci de m'aiguiller vers la bonne solution. Transaction , concurrency etc ...

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 777
    Points : 1 077
    Points
    1 077
    Par défaut
    Si je comprend biens dans ton cas tu veux eviter un double insert dans la table "Reservation" ?
    Tu pourrais faire une store proc du genre :

    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
    create procedure SP_Reservation
      @startdate datetime,
      @enddate datetime,
      @emplacementid int,
      @clientid int,
      @inserted bit output
    as
    begin
      Insert into Reservation (startdate,  enddate,  emplacementid,  clientid)
      select 
      @startdate,
      @enddate,
      @emplacementid,
      @clientid
      from Emplacement e
     where e.emplacementid=@emplacementid and not exstis(select null from reservation r where r.EmplacementId = e.EmplacementId --and [date ou autre critères]
    select @inserted = cast(case when @@rowcount = 0 then 0 else 1 end as bit)
    end
    
    Code non testé, c'est juste une idée.

  3. #3
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    une transaction verrouille les lignes modifiées, à savoir si tu fais un update/insert/delete, la ligne ne peut être ni modifiée ni lue (par défaut, car on peut quand même dans certains cas) par un autre, tant que tu n'es pas sorti de la transaction
    c'est un verrou qui fait attendre ceux qui veulent accéder à la ligne

    ca n'empeche donc pas de vérifier que ce que tu veux faire est autorisé comme avec la requete de Dokho1000 qui fait un insert avec un where qui vérifie
    (tu n'es pas obligé de faire une procédure stockée, le commandtext peut contenir plusieurs instructions)
    par contre je ne suis pas sur qu'un insert suivi d'un where not exists n'est pas exécuté en 2x auquel cas le select pour retourner que c'est faisable et l'insert serait fait après, donc potentiellement un problème si 2 se croisent au mauvais moment, un expert sql server pourrait confirmer ça

    il est aussi possible de gérer ça en partie .net avant d'accéder à la base de données
    si tu as une méthode qui s'occupe de faire les inserts, tu peux mettre un lock qui fait qu'un seul thread pourra y accéder à la fois (c'est chacun son tour, les autres en cas de simultané attendent)
    là tu as le temps de vérifier que ca n'est pas déjà pris en base, puis de faire ton insert
    l'inconvénient c'est que si tu as 100 clients qui font des résa en même temps ca va les ralentirs parfois pour rien, alors qu'sql server pourrait en traiter plein à la fois sans s’emmêler les pinceaux
    si tu as la liste des résa en ram et indexé (dictionary par exemple) par contre ca devient très rapide à tester donc le lock ne ralentira pas spécialement, par contre il faut être sûr de son cache, et donc de son code (ca fait plus de lignes qu'en sql)


    le mieux reste quand même de structurer ses tables pour pouvoir mettre un index unique, lui te garantira que même si tu as mal codé, ca ne pourra pas arriver
    avec ton créneau horaire ca me semble difficile si plusieurs jours peuvent arriver entre debut et fin
    par contre si pour chaque jour tu mets une entrée dans la table (à savoir 3 jours = 3 lignes dans la table) alors tu peux mettre un index unique sur debut+fin+idemplacement et là c'est le sgbdr qui te jetteras si tu essayes
    (ca n'empeche pas de tester au mieux, coder en réaction aux erreurs n'est pas une bonne pratique)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. [PHP 5.4] Construction forum : conflit lors d'une vérification d'autorisation
    Par Marie08 dans le forum Langage
    Réponses: 15
    Dernier message: 27/11/2015, 12h38
  2. [WD15] Gérer un conflit lors d'une réplication automatique
    Par ykydra dans le forum WinDev
    Réponses: 1
    Dernier message: 07/01/2011, 06h14
  3. Gestion thread lors d'une connexion FTP
    Par lucas67 dans le forum C#
    Réponses: 4
    Dernier message: 12/07/2010, 15h48
  4. Réponses: 4
    Dernier message: 17/07/2009, 15h02
  5. [MySQL] Gestion d'un champ auto_increment lors d'une insertion
    Par b_e_n_n dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 01/06/2008, 20h33

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