Bonjour!
Je suis debutant dans les bases de donnees et je n'arrive pas vraiment a comprendre quel est le meilleur moyen de synchroniser les ecritures dans une base de donnees.
Je pars sur un cas simple avec deux tables:
- la table "GROUPS" qui definit des groupes d'utilisateurs
- la table "ROLES" qui definit les roles des utilisateur.
A un groupe peut etre assigne un role ou aucun role.
J'ai une clef etrangere dans la table "ROLES" qui pointe sur la table GROUPS.
Les deux tables possedent une clef primaire de type integer auto-incrementee.
Voila la situation que je ne sais comment gerer correctement:
J'ai deux transactions concurrente en cours, la premiere modifie le groupe "groupe1" en lui assignant le role "administrateur" et la deuxieme detruit le role "administrateur".
Ce que j'ai ecrit et qui m'amene un dead lock potentiel:
Transaction 1:
Transaction 2:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 BEGIN TRANSACTION SELECT FROM GROUPS WHERE SEQ=SEQGROUP1 FOR UPDATE => Exclusive lock sur le groupe vise SELECT FROM ROLE WHERE SEQ=SEQADMIN FOR SHARE => Share lock sur le role UPDATE GROUPS SET ROLESEQ=SEQADMIN WHERE SEQ=SEQGROUP1 COMMIT
Je prefere ne pas utiliser de table lock ni utiliser le mode d'isolation SERIALIZABLE des transactions.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 BEGIN TRANSACTION SELECT FROM ROLES WHERE SEQ=SEQADMIN FOR UPDATE => Exclusive lock sur le role UPDATE GROUPS SET ROLESEQ=NULL WHERE ROLESEQ=SEQADMIN => Exclusive lock DELETE FROM ROLES WHERE SEQ=SEQADMIN COMMIT
Quelle est la bonne methode pour synchroniser ce ca simple?
Merci d'avance,
madric
Partager