Implementing transaction support

From Morfikwiki.com

Jump to: navigation, search

Contents

[edit] Introduction

Do you need explicit transaction control in some webmethods?

This tip gives you an example of how a transaction can be started and comitted in a webmethod

[edit] Part 1

Here is some code which can be used (in the server-side) of a web method to test a transaction with rollback.

Note that this field DBTransaction.Isolation has been set to tiConsistency. This field could be set to: (tiConcurrency,tiConsistency,tiCommitted)

[edit] Related Code


Unit WebMethod1;

Interface

Uses
    SystemDatabaseIBO;

Type
WebMethod1=Class(WebMethod)
    OrganizationID  : String;
    FundraiserID    : String;
    GuestID         : String;
    NewInvoiceID    : Integer;
    NewInvoiceIDStr : String;
  Private
    Function  BeginTransaction : TIB_Transaction;
    Procedure EndTransaction(Transaction : TIB_Transaction; Rollback : Boolean = False);
    Function  AddInvoiceRecord: Boolean;
  Public
    Procedure Execute; override;
End; ['Published=False'];

Implementation

Function WebMethod1.BeginTransaction : TIB_Transaction;
Begin
    Result := TIB_Transaction.Create(SoapServer.DefaultDBConnection.DBSession);
    Result.IB_Connection := SoapServer.DefaultDBConnection.DBConnection;
    SoapServer.DefaultDBConnection.DBConnection.DefaultTransaction := Result;
    Result.StartTransaction;
End;

Procedure WebMethod1.EndTransaction(Transaction : TIB_Transaction; Rollback : Boolean = False);
Begin
    If Rollback Then Transaction.Rollback
                Else Transaction.Commit;
    Transaction.Free;
End;

Function WebMethod1.AddInvoiceRecord: Boolean;
Const
    S = 'INSERT INTO "tblInvoices" ("OrganizationID","FundraiserID","GuestID","Amount","Paid") '
        + 'VALUES (%s,%s,%s,%d,%d) RETURNING ID';
Var
    SQLStr : String;
    AcctRS : TRecordSet;
Begin
    Result := False;
    SQLStr := Format(S, [OrganizationID, FundraiserID, GuestID, 0, 0]);
    AcctRS := DefaultDBConnection.CreateRecordSet(SQLStr);
    Try
        AcctRS.Prepare;
        AcctRS.Execute;
        NewInvoiceID    := AcctRS.FieldByName('ID').AsInteger;
        NewInvoiceIDStr := IntToStr(NewInvoiceID);
        Result          := True;
    Except
        Result := False;
    End;
    AcctRS.Free;
End;

Procedure WebMethod1.Execute;
Var
    Transaction : TIB_Transaction;
Begin
    Transaction := BeginTransaction;
    Try
        AddInvoiceRecord;
    Finally
        EndTransaction(Transaction, True);
    End;
End;

End.

[edit] See also

[edit] External links

Personal tools