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

Langage SQL Discussion :

Update + Delete dans la même transaction


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 21
    Points : 18
    Points
    18
    Par défaut Update + Delete dans la même transaction
    Bonjour,

    J'ai un petit souci dans mon application.

    En effet lors de la modification d'un utilisateur je mets à jour sa liste de droits.

    Ainsi, pour chaque droit modifié je lance un update sur la table droit et pour chaque droit supprimé je lance une requête delete sur la table.

    Lorsque je suis dans la même transaction, la suppression plante car il y a un verrou sur la table.

    Merci par avance de votre aide.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    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 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    Par défaut
    Il suffit d'utiliser un MERGE.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    Merci pour ta réponse.

    Cependant je ne vois pas comment le merge peut répondre à ma question.

    En effet, voici un extrait de la fonction posant problème.

    La connaissance des droits à modifier ou à supprimer ne vient pas d'une table mais d'un objet.

    Code vb : 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
     Dim maConnection As Connection
            maConnection = ApplicationContext.GetInstance.CurrentConnection
            maConnection.BeginTrans()
     
            Try
                FactoryUtilisateur.UpdateUtilisateur(maConnection, monUtilisateur)
                If Not monUtilisateur.Droits Is Nothing Then
                    Dim mesDroitsEnBase As Droits
                    mesDroitsEnBase = GetDroitsForUtilisateur(monUtilisateur)
     
                    For Each monDroit As Droit In monUtilisateur.Droits
                        If mesDroitsEnBase Is Nothing OrElse Not mesDroitsEnBase.Exist(monDroit) Then
                        Else
                            UpdateDroit(maConnection, monDroit, monUtilisateur)
                        End If
                    Next
     
                    For Each monDroit As Droit In mesDroitsEnBase
                        If monUtilisateur.Droits Is Nothing OrElse Not monUtilisateur.Droits.Exist(monDroit) Then
                            SupprimeDroit(maConnection, monDroit, monUtilisateur)
                        End If
                    Next
     
                    maConnection.CommitTrans()
                End If
                monUtilisateur.MajInfoFromUtilisateur(GetUtilisateur(monUtilisateur.ID), True)
     
            Catch ex As Exception
                maConnection.RollbackTrans()
                Throw ex
            End Try

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Il est particulièrement important de préciser le SGBD pour les problèmes de transaction, les SGBD n'ayant pas la même gestion de la concurrence d'accès.

    Cependant au sein d'une même transaction, je trouve douteux d'être bloqué, es tu sûr de ne pas ouvrir 2 sessions ?
    Évidemment il y a peu de chance d'obtenir des réponses sur le forum SQL concernant un code VB.

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Cela dit, pour éviter ce genre de souci, et bien d'autres encore, il n'est pas recommandé de gérer les transactions coté appli.

    en l’occurrence, il serait préférable d'envoyer la liste des "nouveaux" droits à une procédure stockée qui ferait le merge

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    le SGBD utilisé est Access.

    Le code n'est là que pour mieux comprendre la mécanique car le problème serait plus lié à la base de données mais je poste aussi le message sur le forum vb. Sait-on jamais.

    Et je suis tout aussi surpris de l'incapacité de faire un update et un delete sur la même table dans une transaction mais bon avec Access nous sommes à l'abris de rien

Discussions similaires

  1. Update + Delete dans la même transaction
    Par kornetmuse dans le forum ADO.NET
    Réponses: 7
    Dernier message: 05/03/2013, 13h56
  2. Réponses: 4
    Dernier message: 28/05/2012, 22h22
  3. Réponses: 4
    Dernier message: 21/01/2011, 14h53
  4. Réponses: 2
    Dernier message: 05/08/2008, 16h27
  5. Réponses: 3
    Dernier message: 16/01/2007, 11h13

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