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;
        
        transaction_one=gda_transaction_new("accounts1");
        gda_transaction_set_isolation_level(transaction_one,
        GDA_TRANSACTION_ISOLATION_SERIALIZABLE);
        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);
        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);
        
        gda_connection_commit_transaction(connection,transaction_one);
        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);
        
        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.