Bonjour à tous,

J'essaye de faire une transaction mais lorsque une exception est levée le rollback ne se fait pas sur la totalité des requêtes effectuées.

Pour le vérifier j'ai volontairement introduit une erreur lors du 2eme passage de ma boucle foreach pour que la clause WHERE du UPDATE n'existe pas.


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
$dbh1->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
$dbh1->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."'";
 
$dbh1->exec($query_inFacture);
$IDFacture=$dbh1->lastInsertId();
 
foreach($tabClient as $key=>$value){
 
$query_rsClient="SELECT revendPaye, typeRef, IDRef FROM clients WHERE ID=".$value;
 
$rsClient=$dbh1->query($query_rsClient);
$row_rsClient = $rsClient->fetch(PDO::FETCH_ASSOC);
 
// ici traitement des données
 
if($k==0)$query_rsMajClient="UPDATE clients SET revendPaye='".$majPaye."' WHERE ID=".$value;
else $query_rsMajClient="UPDATE clients SET revendPaye='".$majPaye."' WHERE ID=xx";
$k++;
 
$dbh1->exec($query_rsMajClient);
 
};
 
$dbh1->commit();
} 
catch(Exception $e){
echo $e->getMessage();
$dbh1->rollBack();
}; // FIN DE TRANSACTION
l'exception est bien levée, le rollback se fait en partie et annule le "INSERT INTO factures_vendeurs..." mais le premier "UPDATE clients..." n'est pas annulé, les valeurs modifiées sont toujours présentes dans la table client.

est-il bien possible de revenir en arrière sur plusieurs requêtes dans la même table ?

Merci d'avance pour vos réponses