PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

pqxx एक कार्य लेनदेन का पुन:उपयोग / पुन:सक्रिय करें

pqxx::work सिर्फ एक pqxx::transaction<> . है जो अंततः अपना अधिकांश तर्क pqxx::transaction_base

यह वर्ग कई लेन-देन के लिए सेवा करने का इरादा नहीं है। इसके बजाय, यह एक कोशिश/पकड़ ब्लॉक के भीतर एकल लेनदेन के लिए अभिप्रेत है। इसका एक राज्य सदस्य चर है (m_Status ) जो कभी भी एक प्रतिबद्धता के बाद भी पुन:प्रारंभ नहीं किया जाता है।

सामान्य पैटर्न है:

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

तर्कसंगत रूप से, libpqxx विलोपन पर लेनदेन को वापस ले सकता है (पूरी तरह से कोशिश/पकड़ से बचने के लिए) लेकिन ऐसा नहीं है।

ऐसा लगता है कि यह आपके उपयोग के पैटर्न के अनुकूल नहीं है जैसा आप चाहते हैं G_work अपने कार्यक्रम में कई स्थानों से एक वैश्विक चर सुलभ होने के लिए। कृपया ध्यान दें कि pqxx::work कनेक्शन ऑब्जेक्ट्स के लिए क्लास नहीं है, बल्कि C++ अपवाद हैंडलिंग के साथ start/commit/rollback को इनकैप्सुलेट करने का एक तरीका है।

फिर भी, libpqxx आपको लेन-देन के बाहर बयान निष्पादित करने की अनुमति देता है (या कम से कम libpqxx-प्रबंधित लेनदेन के बाहर)। आपको pqxx::nontransaction . के उदाहरणों का उपयोग करना चाहिए कक्षा।

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

कृपया ध्यान दें कि यह इसके बराबर है:

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

अंततः, आपको लेन-देन प्रबंधित करने से कोई नहीं रोकता pqxx::nontransaction . के साथ . यह विशेष रूप से सच है यदि आप सेवपॉइंट चाहते हैं . मैं pqxx::nontransaction . का उपयोग करने की भी सलाह दूंगा अगर आपका लेन-देन किसी फंक्शन स्कोप (जैसे ग्लोबल स्कोप पर) से आगे तक चलने के लिए है।

#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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पर्यवेक्षक पदानुक्रम की सूची प्राप्त करने के लिए SQL क्वेरी। कर्मचारी -> पर्यवेक्षक -> पर्यवेक्षक

  2. postgresql - id andparent_id . बदलकर एक ही टेबल से पंक्तियों के साथ ट्री टेबल अपडेट करें

  3. कुप्पी-SQLAlchemy लोअर केस इंडेक्स - कार्यात्मक लंघन, SQLAlchemy प्रतिबिंब द्वारा समर्थित नहीं है

  4. PostgreSQL अपवाद हैंडलिंग

  5. PostgreSQL के साथ उत्पादन में जाने के लिए दस युक्तियाँ