pqxx::work
er kun en pqxx::transaction<>
som til sidst får det meste af sin logik fra pqxx::transaction_base
.
Denne klasse er ikke beregnet til at tjene til flere transaktioner. I stedet er det beregnet til en enkelt transaktion inden for en try/catch-blok. Den har en tilstandsmedlemsvariabel (m_Status
) som aldrig geninitialiseres, heller ikke efter en commit.
Det normale mønster er:
{
pqxx::work l_work(G_connexion);
try {
l_work.exec("insert into test.table1(nom) VALUES('foo');");
l_work.commit();
} catch (const exception& e) {
l_work.abort();
throw;
}
}
Nok så kunne libpqxx rulle transaktionen tilbage ved sletning (for at undgå try/catch helt), men det gør den ikke.
Det ser ud til, at dette ikke passer til dit brugsmønster, som du ønsker G_work
at være en global variabel, der er tilgængelig fra flere steder i dit program. Bemærk venligst, at pqxx::work ikke er klassen for forbindelsesobjekter, men kun en måde at indkapsle start/commit/rollback med C++ undtagelseshåndtering.
Ikke desto mindre giver libpqxx dig også mulighed for at udføre sætning uden for transaktioner (eller i det mindste uden for libpqxx-administrerede transaktioner). Du bør bruge forekomster af pqxx::nontransaction
klasse.
#include "pqxx/nontransaction"
pqxx::connection G_connexion("dbname=basetest user=usertest password=1234");
pqxx::nontransaction G_work(G_connexion);
int f() {
G_work.exec("insert into test.table1(nom) VALUES('foo');");
G_work.exec("insert into test.table1(nom) VALUES('bar');");
}
Bemærk venligst, at dette svarer til:
#include "pqxx/nontransaction"
pqxx::connection G_connexion("dbname=basetest user=usertest password=1234");
int f() {
pqxx::nontransaction l_work(G_connexion);
l_work.exec("insert into test.table1(nom) VALUES('foo');");
l_work.exec("insert into test.table1(nom) VALUES('bar');");
}
Til sidst er der intet, der forhindrer dig i at administrere transaktioner med pqxx::nontransaction
. Dette gælder især, hvis du ønsker savepoints
. Jeg vil også anbefale at bruge pqxx::nontransaction
hvis din transaktion er beregnet til at vare ud over et funktionsområde (f.eks. i globalt omfang).
#include "pqxx/nontransaction"
pqxx::connection G_connexion("dbname=basetest user=usertest password=1234");
pqxx::nontransaction G_work(G_connexion);
int f() {
G_work.exec("begin;");
G_work.exec("insert into test.table1(nom) VALUES('foo');");
G_work.exec("savepoint f_savepoint;");
// If the statement fails, rollback to checkpoint.
try {
G_work.exec("insert into test.table1(nom) VALUES('bar');");
} catch (const pqxx::sql_error& e) {
G_work.exec("rollback to savepoint f_savepoint;");
}
G_work.exec("commit;");
}