Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
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 24/01/2011, 10h43   #1
Invité de passage
 
Inscription : janvier 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 7
Points : 0
Points : 0
Par défaut Verrou transaction sur incrémentation?

Bonjour je suis nouveau sur le forum, je vous passe le bonjour à tous.
Je me suis souvent servit de ce forum qui m'a apporté de nombreuses réponses durant mon expérience de développeur, les réponses les plus pertinentes que j'ai vu!

Je post aujourd'hui car je suis un peu perdu. J'ai des valeurs qui s'incrémente de manière "incohérente" au sein d'une transaction, sans doute quelque chose que je n'ai pas saisi sur les transactions...?

Voici en gros mon problème:
Code :
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
 
$erreur_insert = false;
 
$connex->query("BEGIN");
 
$connex->query("INSERT INTO article_vu SET WHERE id_article='".$article["id_article"]."'");
IF($connex->STATUS() != 1) //affected rows
{
    $erreur_insert = true;
}
 
$connex->query("UPDATE article_cfg SET (nb_vu = nb_vu + 1) WHERE id_article='".$article["id_article"]."'");
IF($connex->STATUS() != 1) //affected rows
{
    $erreur_insert = true;
}
 
IF(!$erreur_insert)
{
    $connex->query("COMMIT");
}
else
{
    $connex->query("ROLLBACK");
}
Ma question est la suivante: Comment ce fait-il que, au bout de pas mal d'article vu le nombre d'enregistrement dans article_vu soit inférieur à nb_vu dans article_cfg?

Es ce véritablement impossible? J'ai vérifié mon code de nombreuses fois à tête reposé et tout me semble correct.

Si vous avez des idées je vois écoute avec attention!!
toch34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 10h49   #2
Membre Expert
 
Inscription : mars 2005
Messages : 1 565
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2005
Messages : 1 565
Points : 2 178
Points : 2 178
Bonjour,

Essayez de vous limiter au SQL. Le code client n'est pas intéressant.

Qu'est sensée faire cette requête ? Je ne connais pas cette syntaxe :

Code :
INSERT INTO article_vu SET WHERE id_article='xx'
vmolines est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/01/2011, 11h18   #3
Invité de passage
 
Inscription : janvier 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 7
Points : 0
Points : 0
A oui pardon, petite erreur de ma part

Code :
1
2
3
4
5
6
7
 
BEGIN;
 
INSERT INTO article_vu ("id_article_vu","id_article",...) VALUES ('','XX',....);
UPDATE article_cfg SET (nb_vu = nb_vu + 1) WHERE id_article='XX';
 
COMMIT;
toch34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 11h30   #4
Membre Expert
 
Inscription : mars 2005
Messages : 1 565
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2005
Messages : 1 565
Points : 2 178
Points : 2 178
Si les requêtes exécutées étaient bien celles que vous aviez copié collé de votre code alors c'est normal que ça ne fasse rien de bon.

Là vous dites avoir fait une erreur mais on ne sait pas où quand comment, si vous avez re testé depuis ...

Bref re présentez votre problème de manière complète si vous voulez être aidés et ne pas faire perdre de temps aux autres :

- Version de base de données
- Script de création des tables
- Script de création du jeu de données
- Résultat attendu
- Requêtes exécutées
- Résultat obtenu

Merci
vmolines est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 12h02   #5
Invité de passage
 
Inscription : janvier 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 7
Points : 0
Points : 0
Citation:
Si les requêtes exécutées étaient bien celles que vous aviez copié collé de votre code alors c'est normal que ça ne fasse rien de bon.
Là vous dites avoir fait une erreur mais on ne sait pas où quand comment, si vous avez re testé depuis ...
Je n'ai pas le code sous la main, je l'ai fait de mémoire et sans doute trop vite en effet... désolé vmolines

J'utilise postgresql 8.3 sur debian avec phppgadmin, je posterai le détail quand je serais chez moi, si je met mes create table de tête je vais encore faire des erreurs.

Le résultat attendu est juste d'avoir une visualisation rapide du nombre d'enregistrement de la table article_vu dans articel_cfg sans avoir a faire un count ou un pg_affected_rows (php) et que le résultat soit correct!!
toch34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 13h04   #6
Invité de passage
 
Inscription : janvier 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 7
Points : 0
Points : 0
Voila un exposé complet:

Les tables:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
CREATE TABLE pub_forfait (
    id_pub_forfait SERIAL PRIMARY KEY,
    id_pub INTEGER NOT NULL REFERENCES pub ON DELETE CASCADE,
 
    ...
 
    nb_pub_vu integer CHECK( nb_pub_vu >= 0 ) NOT NULL,
    nb_pub integer CHECK( nb_pub >= 0 ) NOT NULL,
    fini BOOLEAN NOT NULL
);
 
CREATE TABLE pub_vu_non_log (
    id_pub_vu_non_log SERIAL PRIMARY KEY,
    id_pub_forfait INTEGER NOT NULL REFERENCES pub_forfait ON DELETE CASCADE,
    ...
);
 
CREATE TABLE pub_vu (
    id_pub_vu SERIAL PRIMARY KEY,
    id_pub_forfait INTEGER NOT NULL REFERENCES pub_forfait ON DELETE CASCADE,
    ...
 
);
exemple nouvelle pub vu non loggué:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
BEGIN;
INSERT INTO pub_vu_non_log (
id_pub_vu_non_log,
id_pub_forfait,...
)
VALUES(
NEXTVAL('pub_vu_non_log_id_pub_vu_non_log_seq'), 'XX' ,...);
 
UPDATE pub_forfait SET nb_pub_vu = (nb_pub_vu + 1) WHERE id_pub_forfait = 'XX';
 
-- je sais que je pourrais compter les enr dans les pub_vu à la place
SELECT id_pub_forfait FROM pub_forfait 
WHERE id_pub_forfait = 'XX' 
AND nb_pub_vu >= nb_pub;
 
-- if nb row == 1
UPDATE pub_forfait SET fini = true WHERE id_pub_forfait = 'XX';
 
--if pas d'erreur
COMMIT;
--else
ROLLBACK;
J'imagine qu'il doit y avoir des manière plus élégante de le faire si vous avez des suggestions... cependant ma question n'est pas là.

mon problème au final:
Code :
1
2
3
SELECT * FROM pub_vu_non_log WHERE id_pub_forfait = 'XX';
-- Additionné a 
SELECT * FROM pub_vu WHERE id_pub_forfait = 'XX';
est différent de :
Code :
SELECT nb_pub_vu FROM pub_forfait WHERE id_pub_forfait = 'XX';
Normalement la transaction devrait garder la cohérence que ca commit ou pas?
Merci de votre aide.
toch34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h03.


 
 
 
 
Partenaires

Hébergement Web