sql >> Database >  >> RDS >> PostgreSQL

pqxx hergebruik / heractiveer een werktransactie

pqxx::work is slechts een pqxx::transaction<> die uiteindelijk de meeste logica haalt uit pqxx::transaction_base .

Deze klasse is niet bedoeld om voor meerdere transacties te dienen. In plaats daarvan is het bedoeld voor een enkele transactie binnen een try/catch-blok. Het heeft een staatslidvariabele (m_Status ) die nooit opnieuw wordt geïnitialiseerd, zelfs niet na een vastlegging.

Het normale patroon is:

{
    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;
    }
}

Aantoonbaar zou libpqxx de transactie bij verwijdering kunnen terugdraaien (om de try/catch volledig te vermijden), maar dat doet het niet.

Het lijkt erop dat dit niet past bij uw gebruikspatroon zoals u wilt G_work om een ​​globale variabele te zijn die toegankelijk is vanaf verschillende plaatsen in uw programma. Houd er rekening mee dat pqxx::work niet de klasse is voor verbindingsobjecten, maar slechts een manier om begin/commit/rollback in te kapselen met de afhandeling van C++-uitzonderingen.

Desalniettemin stelt libpqxx u ook in staat om overzichten buiten transacties uit te voeren (of in ieder geval buiten door libpqxx beheerde transacties). Gebruik instanties van 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');");
}

Houd er rekening mee dat dit gelijk is aan:

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

Uiteindelijk, niets belet u transacties te beheren met pqxx::nontransaction . Dit is vooral het geval als u savepoints wilt . Ik zou ook adviseren om pqxx::nontransaction . te gebruiken als het de bedoeling is dat uw transactie langer duurt dan een functiebereik (bijv. wereldwijd).

#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. Postgresql-transactie-ID niet gevonden

  2. Oracle SQL:het extraheren van de week van het jaar uit de datum geeft willekeurige resultaten

  3. Hoe MYSQL-queryresultaten ORDER BY-voorwaarden te maken?

  4. Een tijdelijke tabel maken op basis van een andere tabel in SQL Server