Darren Duncan wrote:

I will clarify that child transactions are just an elegant way of partitioning a larger task, and that parent transactions always overrule children; even if a child transaction commits successfully, a rollback of its parent means there are no lasting changes.
Darren,

Because of this, and the fact that a transaction is basically a guarantee that all or none of the enclosed statements are executed, it is much simpler to implement nested transactions using a counter and the existing transaction API in a set of wrapper functions. There is no need to maintain all the intermediate state information. All you need to know is the current nesting level, and if any enclosed transaction was rolled back.

The following code shows the basic process.

   int transaction_level = 0;
   bool transaction_failed;

   void begin_nested_transaction()
   {
       if (transaction_level++ == 0) {
           transaction_failed = false;
           sqlite3_exec("begin");
       }
   }

   void commit_nested_transaction()
   {
       if (--transaction_level == 0)
           if (transaction_failed)
               sqlite3_exec("rollback");
           else
               sqlite3_exec("commit");
   }

   void rollback_nested_transaction()
   {
       transaction_failed = true;
       commit_transaction();
   }

HTH
Dennis Cote

-----------------------------------------------------------------------------
To unsubscribe, send email to [EMAIL PROTECTED]
-----------------------------------------------------------------------------

Reply via email to