Bonjour à tous,

J'ai une transaction dans laquelle je cherche à effectuer plusieurs UPDATE dans la même table.

J'ai pu constater que parfois tous les UPDATE ne sont pas effectués et pourtant cela ne déclenche pas le ROLLBACK...

Je l'ai vérifié en supprimant l'une des lignes dont je demande l'UPDATE dans la table "clients", je pense que dans la mesure on je demande l'UPDATE d'une ligne qui n'existe pas, cela doit bien lever une erreur ?

Je précise que comme cela m'est déjà arrivé, j'ai bien vérifié que les Tables concernées sont de type InnoDB

Voici le script :

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
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
$guidAcc=(isset($_POST['guidAcc'])) ? ($_POST['guidAcc']=="a") ? 1 : 0 : 0;
 
$tabClient=array();
$tabType=array();
$tabIDRef=array();
$tabMontant=array();
 
for($i=0; $i<=$_POST['nbr']; $i++){
$tab=explode("|",$_POST['acti_'.$i]);
 
$tabMontant[]=$_POST['montant_'.$i];
$tabClient[]=$tab[0];
$tabType[]=$tab[1];
$tabIDRef[]=$tab[2];
}
 
$clientBdd=implode("/",$tabClient);
$refBdd=implode("/",$tabIDRef);
$typeBdd=implode("/",$tabType);
$montantBdd=implode("/",$tabMontant);
 
///////////////////////////////// ECRITURE DANS LA TABLE FACTURES ////////////////////////////////////////////////
 
${"dbh".$rep}->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
${"dbh".$rep}->beginTransaction();
 
try{ // DEBUT DE TRANSACTION
 
$query_inFacture="INSERT INTO factures_vendeurs SET 
date='".date('Y-m-d')."',  
IDVendeur=".$IDvendeur.", 
IDClients='".$clientBdd."', 
actis='".$refBdd."',
type='".$typeBdd."',
guidAcc=".$guidAcc.",  
montant='".$montantBdd."'";
 
${"dbh".$rep}->exec($query_inFacture);
$IDFacture=${"dbh".$rep}->lastInsertId();
 
foreach($tabClient as $key=>$value){
 
$query_rsClient="SELECT revendPaye, typeRef, IDRef FROM clients WHERE ID=".$value;
 
$rsClient=${"dbh".$rep}->query($query_rsClient);
$row_rsClient = $rsClient->fetch(PDO::FETCH_ASSOC);
 
$tabPaye=explode("/",$row_rsClient["revendPaye"]);
$tabIDRefClient=explode("/",$row_rsClient["IDRef"]);
$tabTypeClient=explode("/",$row_rsClient["typeRef"]);
 
$tabCompare=array();
 
foreach($tabTypeClient as $cle=>$valeur)$tabCompare[]=$valeur."_".$tabIDRefClient[$cle];
 
$num=array_search($tabType[$key]."_".$tabIDRef[$key], $tabCompare);
$tabPaye[$num]=$IDFacture;
$majPaye=implode("/",$tabPaye);
 
$query_rsMajClient="UPDATE clients SET revendPaye='".$majPaye."' WHERE ID=".$value;
${"dbh".$rep}->exec($query_rsMajClient);
$tabCompare="";
 
}; // FIN DE FOREACH
 
${"dbh".$rep}->commit();
echo 1;
} 
catch(Exception $e){
${"dbh".$rep}->rollBack();
echo 0;
}; // FIN DE TRANSACTION
Dans un premier temps quelqu'un peut-il me dire pourquoi il n'y a pas de rollback lorsqu'une erreur se produit ?

Dans les cas que j'ai testé l'UPDATE doit se faire sur une trentaine de lignes de la TABLE "clients", ce qui veut dire une trentaine de requêtes UPDATE...

Je ne vois pas comment faire une seule requête d'UPDATE pour mettre à jour 30 lignes en même temps...

Est-ce possible ? est-ce que ça changerai quelque chose ?

Merci d'avance pour vos réponses