Transactions and batch processes


Managing transactions

The special functions we need to do this are defined in the GdaTransaction, GdaConnection and GdaCommand classes, and they are:

Things you have to do to manage transactions are:

  1. Create transaction

  2. Change, if needed, the isolation level

  3. Link transaction to a connection

  4. For each command you want to execute:

    1. Create command

    2. Link transaction to command

    3. Execute command

    4. Free command

  5. Commit or rollback transaction

  6. Free transaction

Here you can see an example:

        void process_accounts(GdaConnection *connection)
        {
          GdaTransaction *transaction_one, *transaction_two;
          GdaCommand *command;
        
(1)          transaction_one=gda_transaction_new("accounts1");
(2)          gda_transaction_set_isolation_level(transaction_one,
                   GDA_TRANSACTION_ISOLATION_SERIALIZABLE);
(3)          gda_connection_begin_transaction(connection,transaction_one);
        
          command=gda_command_new (
                                   "UPDATE accounts SET balance=balance+50"
                                   "WHERE account_code=456",
                                   GDA_COMMAND_TYPE_SQL,
                                   GDA_COMMAND_OPTION_STOP_ON_ERRORS);
(4)          gda_command_set_transaction(command,transaction_one);
          gda_connection_execute_non_query(connection,command,NULL);
          gda_command_free(command);
        
          command=gda_command_new (
                                   "UPDATE accounts SET balance=balance-50"
                                   "WHERE account_code=12",
                                   GDA_COMMAND_TYPE_SQL,
                                   GDA_COMMAND_OPTION_STOP_ON_ERRORS);
          gda_command_set_transaction(command,transaction_one);
          gda_connection_execute_non_query(connection,command,NULL);
          gda_command_free(command);
        
(5)          gda_connection_commit_transaction(connection,transaction_one);
(6)          g_object_unref(transaction_one);
        
          transaction_two=gda_transaction_new("accounts2");
          gda_transaction_set_isolation_level(transaction_two,
                   GDA_TRANSACTION_ISOLATION_SERIALIZABLE);
          gda_connection_begin_transaction(connection,transaction_two);
        
          command=gda_command_new (
                                   "UPDATE accounts SET balance=balance+400"
                                   "WHERE account_code=456",
                                   GDA_COMMAND_TYPE_SQL,
                                   GDA_COMMAND_OPTION_STOP_ON_ERRORS);
          gda_command_set_transaction(command,transaction_two);
          gda_connection_execute_non_query(connection,command,NULL);
          gda_command_free(command);
        
          command=gda_command_new (
                                   "UPDATE accounts SET balance=balance-400"
                                   "WHERE account_code=12",
                                   GDA_COMMAND_TYPE_SQL,
                                   GDA_COMMAND_OPTION_STOP_ON_ERRORS);
          gda_command_set_transaction(command,transaction_two);
          gda_connection_execute_non_query(connection,command,NULL);
          gda_command_free(command);
        
(7)          gda_connection_rollback_transaction(connection,transaction_two);
          g_object_unref(transaction_one);
        
          execute_sql_command(connection,"SELECT * FROM accounts");
        }
        
(1)
Creates first transaction.
(2)
Changes the isolation level.
(3)
Links it to connection.
(4)
Links command to transaction.
(5)
Makes commit on transaction.
(6)
Frees transaction.
(7)
Makes rollback on second transaction.