bien sûr que c'est possible
mais explique ton cas et on te dira quoi et comment faire
bah simple question , simplement pour savoir si c'est possible, et les cas où en peut l'utlisé et où on ne doit pas le faire, merci
prenons l'eample sité dans ce topique il a proposé cette solution à la place des vérrous
là en annule notre transaction si le nombre des places est négative, aprés que nous avons affirmé au réserveur qu'il y a des places!!!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 T1 BEGIN TRANSACTION PLACE_AVION 1 T3 UPDATE T_VOL SET VOL_PLACES_LIBRES = VOL_PLACES_LIBRES - 5 WHERE VOL_ID = 2 T4 INSERT INTO T_CLIENT_VOL VALUES (77, 2, 5) T5 if (SELECT VOL_PLACES_LIBRES FROM T_VOL WHERE VOL_ID = 2) < 0 T6 then ROLLBACK TRANSACTION PLACE_AVION 1 T7 else COMMIT TRANSACTION PLACE_AVION 1
il faut que tu lises ça :
http://firebird-fr.eu.org/doku.php?i...s:transactions
mais en gros il n'y a quasiment jamais besoin de poser explicitement des verrous, il faut utiliser les transactions et de toutes façons tout dialogue avec les données d'une base se fait dans le contexte d'une transaction (même un simple select)
C'est vrai que commercialement, c'est pas le top...
Mais il faut raisonner en accès concurrentiel...d'où parfois l'utilité d'un verrouillage.
Le pb du verrouillage est qu'il doit être en place le minimum de temps possible, le topic cité doit bien le mentionner, afin de ne pas pénaliser les autres utilisateurs.
C'est facile à dire, mais moins facile à faire selon le SGBD: ça dépend de la "maille" sur laquelle le verrou s'applique : la page, la ligne ?
ok, merci, je vais lire encore plus sur le sujet,
juste un petit exemple avec des transactions read committed
(la table a une contrainte qui interdit d'avoir un nombre de place disponibles inférieure à zéro) et j'ai laissé les messages d'exceptions lévées par Firebird
Après on peut jouer avec les différents types de transactions
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 La première transaction regarde la disponibilité readcommitted read [(8,)] La deuxième transaction regarde la disponibilité readcommitted read [(8,)] La première transaction regarde la disponibilité readcommitted write [(8,)] La deuxième transaction prend 5 places (pas encore committé) readcommitted write La première transaction prend 5 places et veux committer (-901, 'isc_dsql_execute: \n lock conflict on no wait transaction\n deadlock\n update conflicts with concurrent update\n concurrent transaction number is 89') rollback car échec La deuxième transaction veux commiter commit réussi La première transaction (en fait une troisième car la première est terminée par le rollback) réessaye de prendre 5 places et veux committer (-297, "isc_dsql_execute: \n Operation violates CHECK constraint INTEG_5 on view or table T1\nSQL traceback (most recent call last):\n At trigger 'CHECK_4'") rollback car échec
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager