Bonjour,

J'ai un problème avec la biliothèque SOCI et sa gestion des transactions sql ...

Je dispose d'une classe Account et Account_model permettant de créer, modifier, supprimer des comptes utilisateurs.
La classe Account_model hérite de la classe Engine_model qui instancie la session à la base de données.

Account_model.cpp :
Code c++ : 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
#include "Accounts_model.h"
 
using namespace soci;
using namespace std;
 
Accounts_model::Accounts_model() : Engine_model() {
    Log::trace(3, "Accounts_model - Constructeur");
    Log::trace(1, "Initialisation des variables de classes [...]");
    begin();
    int_id = -1;
    str_login = "";
    str_loginCrypted = "";
    str_password = "";
    Log::trace(1, "Initialisation des variables de classes [OK]");
}
[...]
int Accounts_model::newAccount(){
    Log::trace(3, "Accounts_model - newAccount");
    Log::trace(2, "Transaction SQL : BEGIN");
    transaction tr(*sql);
    try{
        Log::trace(1, "Insertion du nouveau compte en base [...]");
        *sql << "INSERT INTO Accounts(login, loginCrypted, password, type) VALUES(:login, :loginCrypted, :password, :type)", use(str_login), use(str_loginCrypted), use(str_password), use(int_type);
        Log::trace(1, "Insertion du nouveau compte en base [OK]");
    }
    catch(std::exception const &e){
        Log::trace(2, "Transaction SQL : ROLLBACK");
        tr.rollback();
        Log::trace(6, "Insertion du nouveau compte en base [ERREUR]");
        Log::trace(6, e.what());
        return -1;
    }
 
    int int_id;
    try{
        Log::trace(1, "Récupération de l'id du compte inséré [...]");
        *sql << "SELECT id FROM Accounts WHERE login = :login", use(str_login), into(int_id);
        Log::trace(1, "Récupération de l'id du compte inséré [OK]");
    }
    catch(std::exception const &e){
        Log::trace(2, "Transaction SQL : ROLLBACK");
        tr.rollback();
        Log::trace(6, "Récupération de l'id du compte inséré [ERREUR]");
        Log::trace(6, e.what());
        return -2;
    }
    Log::trace(2, "Transaction SQL : COMMIT");
    tr.commit();
    return int_id;
}
[...]

Le but étant que le compte utilisateur ne soit pas créer en cas d'erreur ...
J'ai essayer de mettre le commit en commentaire mais la création se fait quand même.

Voici ce que dis la doc à ce propos :
http://soci.sourceforge.net/doc/stat...l#transactions
With the above pattern the transaction is committed only when the code successfully reaches the end of block. If some exception is thrown before that, the scope will be left without reaching the final statement and the transaction object will automatically roll back in its destructor.
J'ai essayer de mettre un exit(-1) avant la fin du bloc, je n'ai donc pas l'id du compte créer qui est retourné mais le compte est belle et bien créée ...

Si quelqu'un peut éclairer ma lanterne sur ce sujet ...
Je pense que je dois mal m'y prendre, j'ai essayer de déclarer la transaction en variable de classe mais cela ne change rien ...