pqxx::work
只是一个pqxx::transaction<>
最终从pqxx::transaction_base
.
此类不打算用于多个事务。相反,它适用于 try/catch 块中的单个事务。它有一个状态成员变量 ( 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 可以在删除时回滚事务(以完全避免 try/catch),但事实并非如此。
这似乎不适合您的使用模式,因为您希望G_work
成为可从程序中的多个位置访问的全局变量。请注意 pqxx::work 不是连接对象的类,而只是一种使用 C++ 异常处理封装开始/提交/回滚的方法。
尽管如此,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;");
}