Understanding the differences between Table and Transaction API's

后端 未结 2 708
攒了一身酷
攒了一身酷 2020-12-15 09:50

Friends,

This Ask Tom thread which I found via another SO question, mentions Table and Transactional API\'s and I\'m trying to understand the difference between th

2条回答
  •  醉酒成梦
    2020-12-15 10:21

    A table API (TAPI) is a simple API that provides the basic CRUD operations for a table. For example, if we have a tableR MYTABLE (id INTEGER PRIMARY KEY, text VACHAR2(30)), then the TAPI would be something like:

    package mytable_tapi is
        procedure create_rec (p_id integer, p_text varchar2);
        procedure update_rec (p_id integer, p_text varchar2);
        procedure delete_rec (p_id integer);
        function get_rec (p_id integer) returns mytable%rowtype;
    end;
    

    When you use TAPIs, every table has a TAPI, and every insert, update and delete goes through the TAPI.

    A transaction API (XAPI) is an API that works at the transaction level rather than at the individual CRUD level (though in some cases this will be the same thing). For example, a XAPI to handle a banking transactions might look something like this:

    package banking_xapi is
        procedure make_transfer (p_from_account integer, p_to_account integer,
                                 p_amount number);
        ... -- other XAPI procs
    end;
    

    The make_transfer procedure may not perform a single insert, update or delete. It may do something like this:

    procedure make_transfer (p_from_account integer, p_to_account integer,
                             p_amount number)
    is
    begin
        insert into transfer_details (from_account, to_account, amount)
           values (p_from_account, p_to_account, p_amount);
    
        update accounts set balance = balance-p_amount
        where account_no = p_from_account;
    
        update accounts set balance = balance+p_amount
        where account_no = p_to_account;
    end;
    

    i.e. it performs an entire transaction, which may consist of 1 or several DML statements.

    A TAPI proponent would say that this is coded wrong and should contain no DML, but instead call TAPI code like:

    procedure make_transfer (p_from_account integer, p_to_account integer,
                             p_amount number)
    is
    begin
        transactions_tapi.insert_rec (p_from_account, p_to_account, p_amount);
    
        accounts_tapi.update_rec (p_from_account, -p_amount);
    
        accounts_tapi.update_rec (p_to_account, p_amount);
    end;
    

    Others (like Tom Kyte and myself) would see this as overkill, adding no real value.

    So you can have XAPIs alone (Tom Kyte's way), or XAPIs that call TAPIs (Steve Feuerstein's way). But some systems have TAPIs alone, which is really poor - i.e. they leave it to writers of the user interface to string together the necessary TAPI calls to make up a transaction. See my blog for the implications of that approach.

提交回复
热议问题