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