Précédent   Forum des professionnels en informatique > Bases de données > Firebird > Connexion aux bases de données
Connexion aux bases de données Forum d'entraide sur la connectivité Firebird: composants, drivers, transactions, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/09/2006, 14h37   #1
Modérateur
 
Avatar de Cl@udius
 
Homme Claude Renouleaud
Développeur informatique
Inscription : février 2006
Messages : 4 753
Détails du profil
Informations personnelles :
Nom : Homme Claude Renouleaud
Âge : 49
Localisation : France, Hautes Pyrénées (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2006
Messages : 4 753
Points : 6 769
Points : 6 769
Par défaut [FB1.5][IBX] Paramètres ISC_TPB_

Bonjour

Dans une application Delphi utilisant les compos IBX pour accéder à ma base, après lecture de cet excellent article de PierreY chez Firebird-fr, j'ai défini les paramètres de la transaction ainsi:

Code :
1
2
3
4
 
isc_tpb_write
isc_tpb_consistency
isc_tpb_wait
En réalité ce compo IBTransaction est lié à un compo IBStoredProc. La PS en question me renvoie un n° unique (N° de commande en l'occurrence). Celle-ci construit ce n° en accédant à une table COMPTEUR.

J'aimerais savoir si ces paramètres me garantirons de me prémunir d'accès simultanés sur la table COMPTEUR qui aurait pour concéquence de renvoyer des n° identiques.

Bref, accès concurrentiels ou pas, et est-ce la bonne méthode ou pas ?

@+ Claudius
__________________
A la question technique que par MP/MV tu formuleras, la réponse aux oubliettes finira.
Cl@udius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2006, 15h10   #2
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
ben non pas forcément
mais on a déjà répondu X fois à ce genre de question, je ne vois pas pourquoi à chaque fois vous voulez tous réinventer la roue
il y a deux documents qui traitent de cette question et qui apportent des solutions


http://www.ibobjects.com/docs/ti_AuditableSeries.ZIP

et

http://octobinz.developpez.com/artic...e/generateurs/
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2006, 15h36   #3
Modérateur
 
Avatar de Cl@udius
 
Homme Claude Renouleaud
Développeur informatique
Inscription : février 2006
Messages : 4 753
Détails du profil
Informations personnelles :
Nom : Homme Claude Renouleaud
Âge : 49
Localisation : France, Hautes Pyrénées (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2006
Messages : 4 753
Points : 6 769
Points : 6 769
Réinventer la roue, sûrement pas !

J'avais déjà lu l'article sur les incréments purs qui est assurément une bonne méthode pour numéroter des documents tels que des factures.

Cependant je ne suis pas à la recherche d'un tel incrément. Peu importe si il y a des trous dans la numérotation.
Les pièces que je dois numéroter possèdent un format un peu particulier: Annee+Mois+Incrément. L'appel d'un GEN_ID via un trigger ne peut satisfaire à cette demande.

Donc mon soucis reste de pouvoir m'assurer d'un accès exclusif à ma table COMPTEUR.

N'utilisant les composant IBObjects je regarderais plus tard en détail ce projet exemple.

Claudius
__________________
A la question technique que par MP/MV tu formuleras, la réponse aux oubliettes finira.
Cl@udius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2006, 17h19   #4
Membre émérite
 
Avatar de Yurck
 
Homme
Ingénieur développement logiciels
Inscription : février 2005
Messages : 682
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 3
Localisation : France, Loire Atlantique (Pays de la Loire)

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

Informations forums :
Inscription : février 2005
Messages : 682
Points : 921
Points : 921
Bonjour,

Tu veux un accès exclusif à une table de numérotation.
Moi j'enregistre mon nouveau numéro formater comme le tien (annee mois itération dans le mois) dans une table sur une procédure stockée qui me retouorne le nouveau numéro valide.
Dans cette table ce numéro fait partie d'un index unique donc si un autre appel à cette procédure tente d'enregistrer le même numéro il a le droit à une violation de clef et alors je traite cette vialoation dans ma procédure pour demander un nouveau numéro.

Ce n'est pas plus compliqué que d'attendre qu'un table soit libéré en écriture.

a+
__________________
Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
Aymond d'Alost
Yurck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2006, 18h18   #5
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
Citation:
Envoyé par Claudius40
Les pièces que je dois numéroter possèdent un format un peu particulier: Annee+Mois+Incrément. L'appel d'un GEN_ID via un trigger ne peut satisfaire à cette demande.
et pourquoi donc ?

je ne vois pas pourquoi ce ne serait pas possible via un trigger, c'est basique presque

Code :
1
2
3
 
  IF (new.DESIGNATION IS NULL)
  then new.DESIGNATION = CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS CHAR(4))||'-'||CAST(EXTRACT(MONTH FROM CURRENT_DATE) AS CHAR(2))||'-'||CAST(gen_id(G_ID_T_ENTRP, 1) AS CHAR(8));
c'est à affiner, mais vraiment pas très compliqué
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2006, 19h10   #6
Membre émérite
 
Avatar de Yurck
 
Homme
Ingénieur développement logiciels
Inscription : février 2005
Messages : 682
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 3
Localisation : France, Loire Atlantique (Pays de la Loire)

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

Informations forums :
Inscription : février 2005
Messages : 682
Points : 921
Points : 921
Bonjour,

La solution de makowski me paraît franchement séduisante, d'autant plus que tu peux réinitialiser ton générateur en début de mois.

a+
__________________
Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
Aymond d'Alost
Yurck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2006, 08h55   #7
Modérateur
 
Avatar de Cl@udius
 
Homme Claude Renouleaud
Développeur informatique
Inscription : février 2006
Messages : 4 753
Détails du profil
Informations personnelles :
Nom : Homme Claude Renouleaud
Âge : 49
Localisation : France, Hautes Pyrénées (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2006
Messages : 4 753
Points : 6 769
Points : 6 769
Citation:
Envoyé par makowski
je ne vois pas pourquoi ce ne serait pas possible via un trigger, c'est basique presque
Cette solution d'une simplicité effarante m'avait échappé !
Pourquoi faire simple quand on peut faire compliqué ?

Merci à vous deux.
@+
__________________
A la question technique que par MP/MV tu formuleras, la réponse aux oubliettes finira.
Cl@udius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2006, 11h21   #8
Membre du Club
 
Inscription : mai 2002
Messages : 56
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : mai 2002
Messages : 56
Points : 65
Points : 65
Envoyer un message via ICQ à PierreY
Citation:
Envoyé par Claudius40
article de PierreY chez Firebird-fr
Merci ;-)

Pour répondre strictement à ta question, et sachant que la bonne réponse est d'utiliser un générateur, il manque des paramètres, ton souhait est de faire fonctionner firebird au niveau d'isolement "SERIALIZABLE" :

SERIALIZABLE : isc_tpb_consistency + isc_tpb_wait + isc_tpb_lock_read (lock explicite des tables auxquelles on accède uniquement en lecture) + isc_tpb_lock_write (lock explicite des tables auxquelles on accède en lecture et écriture)

Les phrases "lock explicites..." indiquent qu'il faut passer aussi le NOM des tables auxquelles on veut un lock explicite en lecture ou en écriture.

isc_tpb_write est implicite, on utilise isc_tpb_read quand on veut indiquer explicitement qu'on n'a que l'intention de faire des lectures (et se protéger d'une erreur de manipulation ou d'un injection de SQL qui risquerait de provoquer une écriture "malgré nous")

@+

--
Pierre Y.
PierreY est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2006, 11h36   #9
Modérateur
 
Avatar de Cl@udius
 
Homme Claude Renouleaud
Développeur informatique
Inscription : février 2006
Messages : 4 753
Détails du profil
Informations personnelles :
Nom : Homme Claude Renouleaud
Âge : 49
Localisation : France, Hautes Pyrénées (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2006
Messages : 4 753
Points : 6 769
Points : 6 769
Bonjour
Citation:
Envoyé par PierreY
Pour répondre strictement à ta question, et sachant que la bonne réponse est d'utiliser un générateur, ...
Bien évidemment je me suis orienté vers la solution du générateur, étant la solution la plus simple et la plus sûre.

Cependant, par simple curiosité, j'ai essayé de paramétrer un lock explicite en lecture / écriture sur ma table et je n'y suis pas parvenu.
J'ai essayé différentes syntaxes sans succès.

Code :
1
2
3
4
5
6
7
8
9
 
isc_tpb_write   // Inutile puisque implicite
isc_tpb_consistency
isc_tpb_wait
isc_tpb_lock_write "MATABLE"
ou
isc_tpb_lock_wirite 'MATABLE'
ou 
isc_tpb_lock_write MATABLE
Le message en retour est paramètre TPB non reconnu !

Ah, question subsidiaire: les compos IBX sont-ils les mieux adapter à Firebird ?

Merci @+
__________________
A la question technique que par MP/MV tu formuleras, la réponse aux oubliettes finira.
Cl@udius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2006, 11h43   #10
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
pas vraiment non
et surtout pour jouer comme tu le fais
le mieux dans ce cas c'est de prendre les UIB
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2006, 11h50   #11
Modérateur
 
Avatar de Cl@udius
 
Homme Claude Renouleaud
Développeur informatique
Inscription : février 2006
Messages : 4 753
Détails du profil
Informations personnelles :
Nom : Homme Claude Renouleaud
Âge : 49
Localisation : France, Hautes Pyrénées (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2006
Messages : 4 753
Points : 6 769
Points : 6 769
Bonjour
Citation:
Envoyé par makowski
le mieux dans ce cas c'est de prendre les UIB
Merci je vais regarder ca de plus près.

Citation:
Envoyé par makowski
et surtout pour jouer comme tu le fais
Je cherche simplement à comprendre mais pas forcément à le mettre en place. Je suis assez curieux de nature.

Bonne journée. Je tag résolu.

@+
__________________
A la question technique que par MP/MV tu formuleras, la réponse aux oubliettes finira.
Cl@udius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2006, 12h18   #12
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
mais tu as raison, c'est en essayant que l'on apprend
"jouer" n'était pas péjoratif
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2006, 12h22   #13
Membre du Club
 
Inscription : mai 2002
Messages : 56
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : mai 2002
Messages : 56
Points : 65
Points : 65
Envoyer un message via ICQ à PierreY
Citation:
Envoyé par Claudius40
Cependant, par simple curiosité, j'ai essayé de paramétrer un lock explicite en lecture / écriture sur ma table et je n'y suis pas parvenu.
J'ai essayé différentes syntaxes sans succès.

Code :
1
2
3
4
5
6
7
8
9
 
isc_tpb_write   // Inutile puisque implicite
isc_tpb_consistency
isc_tpb_wait
isc_tpb_lock_write "MATABLE"
ou
isc_tpb_lock_wirite 'MATABLE'
ou 
isc_tpb_lock_write MATABLE
Le message en retour est paramètre TPB non reconnu !
Oufti :-) On est loin du compte, soit tu attaques directement les API de Firebird (isc_start_transaction()) et tu envoies directement le TPB encodé correctement comme dernier paramètre (voire les sources de l'API...) soit tu as des composants "bien faits" qui font ça pour toi.

En général il y a des propriétés dans les composants T[XXX]Transaction (où XXX in (IB, UIB, JvUIB, IBO, ...) qui permettent de contrôler les paramètres, le tout est ensuite encodé par le composant pour être passé à l'API :

Dans JvUIB ces paramètres sont LockRead et LockWrite.

Ca donnerait :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
var
  T: TJvUIBTransaction;
begin
  T := TJvUIBTransaction.CREATE(nil);
  T.DATABASE := UnTJvUIBDatabase;
  T.Options := [tpWrite, tpConsistency, tpWait, tpLockWrite, tpExclusive];
  T.LockWrite := 'MATABLE';
 
  WITH TJvUIBQuery.CREATE(nil) do
  begin
    Transaction := T;
    SQL.Text := 'select NEW_ID from PS_GET_UN_ID_POUR_MATABLE';
    try
      Open;
      Result := FIELDS.AsInteger[0];
      Close(etmCommit);
    finally
      Free;
      T.Free;
    end;
  end;
end;
@+

--
Pierre Y.
PierreY est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h09.


 
 
 
 
Partenaires

Hébergement Web