[odb-users] ERROR: prepared statement already exists

Andrea Ranfone a.ranfone at gyala.it
Mon Oct 11 10:28:36 EDT 2021


Hi everyone,

I'm using odb version 2.4.0 with PostgreSQL 12 database and I stepped on 
a strange situation when retrying a transaction after a deadlock exception.

When a recoverable exception occurs and the transaction is rolled back, 
it seems that the deallocation of the prepared statement created in the 
failed transaction fails with the following error:

ERROR:  current transaction is aborted, commands ignored until end of 
transaction block
STATEMENT:  deallocate "query_class_name"

So when I try to run a new transaction to retry the failed transaction I 
get the following error:

ERROR:  prepared statement "query_class_name" already exists


Why the prepared statement is not being rolled-back with the entire 
transaction? Is there something I'm missing about odb::recoverable 
exception handling?


The following is the code snippet I'm using to handle a recoverable 
exception:

template <typename F>

void callFunctionWithTransactionRetry(F &&function, const 
odb::connection_ptr &connectionPtr) {
   auto transactionMaxRetryCount =5;
   for (unsigned short iteration(0);; iteration++) {
     try {
       odb::transaction t(connectionPtr->begin());
       function();
       t.commit();
       break;
     } catch (odb::recoverable &e) {
       if (iteration >= transactionMaxRetryCount) {
         throw_with_trace(MaxRetryExceededException(
             "Max retry exceeded performing database operation. Error: " 
+ std::string(e.what())));
       } else {
         Logger::get().log_debug(
             "A recoverable error occurred performing db operation: " + 
std::string(e.what()) + ". Trying again.");
         continue;
       }
     }
   }

}


Regards,

Andrea Ranfone



More information about the odb-users mailing list