pqxx::work
chỉ là một pqxx::transaction<>
mà cuối cùng nhận được hầu hết logic của nó từ pqxx::transaction_base
.
Lớp này không nhằm phục vụ cho một số giao dịch. Thay vào đó, nó dành cho một giao dịch duy nhất trong một khối try / catch. Nó có một biến thành viên trạng thái (m_Status
) không bao giờ được khởi động lại, ngay cả sau khi cam kết.
Mẫu bình thường là:
{
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;
}
}
Có thể cho rằng libpqxx có thể khôi phục giao dịch khi bị xóa (để tránh thử / bắt hoàn toàn) nhưng không.
Có vẻ như điều này không phù hợp với kiểu sử dụng của bạn như bạn muốn G_work
trở thành một biến toàn cục có thể truy cập từ một số nơi trong chương trình của bạn. Xin lưu ý rằng pqxx ::work không phải là lớp cho các đối tượng kết nối, mà chỉ là một cách để đóng gói begin / commit / rollback với xử lý ngoại lệ C ++.
Tuy nhiên, libpqxx cũng cho phép bạn thực hiện tuyên bố bên ngoài các giao dịch (hoặc ít nhất là bên ngoài các giao dịch do libpqxx quản lý). Bạn nên sử dụng các bản sao của pqxx::nontransaction
lớp học.
#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');");
}
Xin lưu ý rằng điều này tương đương với:
#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');");
}
Cuối cùng, không có gì ngăn cản bạn quản lý các giao dịch với pqxx::nontransaction
. Điều này đặc biệt đúng nếu bạn muốn các điểm lưu
. Tôi cũng khuyên bạn nên sử dụng pqxx::nontransaction
nếu giao dịch của bạn có ý nghĩa kéo dài ngoài phạm vi chức năng (ví dụ:ở phạm vi toàn cầu).
#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;");
}