sql >> Database teknologi >  >> RDS >> PostgreSQL

pqxx genbrug / genaktiver en arbejdstransaktion

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;");
}
 



  1. Brug af Sqlite Stored Procedure i Android

  2. Postgres:hvordan runder du et tidsstempel op eller ned til nærmeste minut?

  3. Optimer/indekser tidszoneforespørgsel

  4. Birt rapport design i formørkelse med subrapport filter