-
lock et jointure
Bonjour
j'ai 3 tables :A,B,C ou B est la table de lien entre A et C (1 record de A est associé à 1 à n record dans C).
Table A........Table B.........Table C
X................X / 1................1
Y................X / 3................2
Z................X / 2................3
. ...............Z / 4................4
Suppression:
Lorsque je veux supprimer un record dans A, je commence par supprimer les associations dans B.
1° begin trans
2° delete records X dans Table B
3° delete record X dans Table A
4° commit
Mise à jour:
Dans une application windows .NET, lorsq'un utilisateur veut modifier le record Z dans A (et donc dans B), je lock les records Z dans les tables A & B comme ceci:
"SELECT * FROM A INNER JOIN B ON ... WHERE ID=Z FOR UPDATE NOWAIT"
ensuite l'utilisateur valide sa saisie et je fais un COMMIT.
problème :
Lorsq'un utilisateur modifie le record Z et que pendant ce temps un autre utilisateur veut supprimer le record X, j'ai comme un deadlock sur l'étape 3° de la suppression. D'après ce que je vois, oracle a posé un verrou exclusif sur la table B.
j'ai utilisé la clause "FOR UPDATE OF A.ID" pour le lock de mise à jour et dans ce cas pas de blocage mais les records X de la table B ne sont pas lockés
Question : comment verrouiller les records X des tables A & B tout en permettant le verrouillage en vue d'une mise à jour de record Y des tables A & B ?
Merci
-
En général, un deadlock apparaît si les verrous sont pris dans un ordre différent. Exemple:
Session 1:
verrouiller lignes table A
verrouiller lignes table B
Session 2:
verrouiller lignes table B
verrouiller lignes table A
Ce deadlock disparaît si toutes les sessions verrouillent dans le même ordre:
Session 1:
verrouiller lignes table A
verrouiller lignes table B
Session 2:
verrouiller lignes table A
verrouiller lignes table B
Notez aussi que:
1. Oracle ne fait jamais d'escalade de verrous de type x verrous lignes devient un verrou de niveau table.
2. Il n'y a pas de "begin tran" dans Oracle: une transaction est automatiquement démarrée lors de la première écriture dans la base (y compris SELECT ... FOR UPDATE puisque les verrous sur les lignes d'une table sont écrits dans les blocs des extents du segment de la table).
-
si tu fais select ****** for update, toute la table est verrouillée.
-
Bonjour,
Bonjour, il faudrait que tu aies un index sur la foreign key dans B, ou du moins un index qui a cette colonne comme première colonne. Alors, Oracle n'aura pas à poser un verrou au niveau table lorsque tu supprime X dans A. Il pourra seulement verrouiller la valeur X grâce à l'index.
Cordialement,
Franck.