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

JDBC Java Discussion :

Accès exclusif en lecture sur une enregistrement en base de données


Sujet :

JDBC Java

  1. #1
    Membre éclairé Avatar de Julien Bodin
    Homme Profil pro
    Devops
    Inscrit en
    Février 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Devops
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 474
    Points : 843
    Points
    843
    Par défaut Accès exclusif en lecture sur une enregistrement en base de données
    Bonjour à tous !

    Je développe une application multi-utilisateurs (et multi-postes). J'utilise une base de donnée relationnelle centrale.

    Dans cette base de donnée j'ai une table qui contient une liste de choses à traiter. Chaque ligne étant une chose à traiter. Je ne rentre pas plus dans le détail, je ne pense pas que celà soit utile.

    J'ai besoin que plusieurs utilisateurs puissent traiter des choses simultanément mais pas qu'ils traitent la même chose simultanément.

    J'aurais donc besoin d'un "truc" (ou d'un bidule, peu importe) qui me permettrait de marquer une ligne comme étant "en cours de traitement" et serait donc exclu temporairement des choses à traiter. Je pourrais donc ajouter un champ booléen dans ma base de donnée pour savoir si une chose est en cours de traitement, mais j'entrevois deux problèmes :

    - Rien n'empêche que plusieurs utilisateurs accèdent au même moment à une chose à traiter et qu'ils la marquent comme étant "en cours de traitement". Une fois marquée la chose n'est plus accessible aux autres mais en cas de demande simultanée c'est foireux.

    - Si un client plante pendant son temps de traitement la chose à traiter n'est plus jamais accessible.

    Je vous remercie d'avance pour votre aide

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Plutôt qu'un champ booléen, je te conseille un champ de type "clé étrangère" vers l'utilisateur devant traiter cette tâche.

    Si ce champ est "null", personne ne traite la tâche et on peut se l'affecter.

    Si un utilisateur plante la tâche, il peut la récupérer, comme on sait quel utilisateur s'est affecté quelle tâche. Avec ce mécanisme, tu peux envisager un tableau de bord rappelant à chaque utilisateur quelles sont les tâches qu'il est en train de créer.

    Concernant les demandes simultanées, cela ne doit normalement poser aucun problème si tes requêtes sont effectuées dans une transaction. Les conflits seront gérés automatiquement par le SGBD.
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  3. #3
    Membre éclairé Avatar de Julien Bodin
    Homme Profil pro
    Devops
    Inscrit en
    Février 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Devops
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 474
    Points : 843
    Points
    843
    Par défaut
    Pas bête du tout l'idée de la clé étrangère, je pense que je vais m'orienter vers cette solution

    En revanche pour l'accès simultané j'ai du mal à voir en quoi les transactions vont m'aider. Jusqu'à présent je les utilisais pour grouper un ensemble de modifications qui devaient être toutes appliquées.

    Là, y'aura un "SELECT" pour récupérer une tâche à effectuer et si deux utilisateurs l’exécutent en même temps ils vont recevoir le même résultat et mettre à jour la clé étrangère.

    A la limite je pourrais faire un second "SELECT" pour confirmer que l'id mis à jour est bien celui de l'utilisateur, auquel cas il répéterais l'opération jusqu'à ce qu'il obtienne ce qu'il souhaite.

    Est-ce que ça pourrait poser un quelconque problème auquel je n'aurais pas pensé ?

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    tu met ta transaction en isolation de type serializable. Ca résoudra ton problème de simultanéité. En effet, avec ce niveau d'isolation on aura, par exemple, si les select/update ont lieu sur la même ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    User 1     User 2
    Begin
               Begin
    Select
               Select
    Update
               Update
    Commit
               Commit -> fail

  5. #5
    Membre éclairé Avatar de Julien Bodin
    Homme Profil pro
    Devops
    Inscrit en
    Février 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Devops
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 474
    Points : 843
    Points
    843
    Par défaut
    merci pour la précision, tchize. Ca me fait l'économie d'un select

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par julien.1486 Voir le message
    merci pour la précision, tchize. Ca me fait l'économie d'un select
    non seulement ca t'économise un select, mais tu n'aurais rien détecté avec ce select en raison de l'isolation entre les transaction

  7. #7
    Membre éclairé Avatar de Julien Bodin
    Homme Profil pro
    Devops
    Inscrit en
    Février 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Devops
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 474
    Points : 843
    Points
    843
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    non seulement ca t'économise un select, mais tu n'aurais rien détecté avec ce select en raison de l'isolation entre les transaction
    J'aurais pas utilisé de transaction dans ce cas

  8. #8
    Membre éclairé Avatar de Julien Bodin
    Homme Profil pro
    Devops
    Inscrit en
    Février 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Devops
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 474
    Points : 843
    Points
    843
    Par défaut
    Bon c'est pas mal. Reste à trouver comment spécifier un lock timeout pour que la connexion de User 2 attende pas 2 minutes avant de balancer l'Exception

    Edit: Trouvé pour l'exception, ça se configure au niveau de la base de donnée.

Discussions similaires

  1. rechercher rapidement sur une très grande base de données access
    Par unja2010 dans le forum Bases de données
    Réponses: 1
    Dernier message: 29/06/2013, 16h16
  2. Monitoring - Nombre d'acces en lecture sur une table
    Par hazou dans le forum Administration et Installation
    Réponses: 3
    Dernier message: 13/11/2012, 16h45
  3. Erreur sur une connection de base de donnée
    Par Masmeta dans le forum Windows Forms
    Réponses: 2
    Dernier message: 28/03/2008, 14h44
  4. droit en lecture sur une feuille avec visual studio
    Par kingson dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 13/04/2007, 06h18
  5. Réponses: 2
    Dernier message: 16/05/2006, 15h17

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