PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

pqxx tái sử dụng / kích hoạt lại giao dịch công việc

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tập lệnh shell để thực thi các lệnh pgsql trong tệp

  2. Pandas - write_frame to sqlite - datetime64 [ns]

  3. Chuyển đổi dự phòng cho PostgreSQL Replication 101

  4. Chèn vào SQL postgres

  5. Các chức năng trả về thiết lập không được phép trong CẬP NHẬT khi sử dụng Postgres 10