Implementing transaction support
From Morfikwiki.com
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.
