📄 transaction.pas
字号:
unit Transaction;
interface
uses
{$IFDEF LINUX}
SysUtils, Types, Classes, QGraphics, QControls, QForms, QDialogs,
QDBCtrls, QStdCtrls, QComCtrls, QExtCtrls, QButtons, QGrids, QDBGrids, OdacClx,
{$ELSE}
Windows, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
DBCtrls, ExtCtrls, StdCtrls, ComCtrls, Buttons, Grids, DBGrids, OdacVcl,
{$ENDIF}
DB, MemDS, DBAccess, Ora, OraTransaction, OraClasses, OdacDemoForm, OdacDemoFrame;
type
TTransactionFrame = class(TOdacDemoFrame)
ToolBar: TPanel;
Panel1: TPanel;
Query1: TOraQuery;
DataSource1: TDataSource;
btOpen: TSpeedButton;
btClose: TSpeedButton;
OraSession2: TOraSession;
Panel2: TPanel;
DBGrid1: TDBGrid;
ToolBar1: TPanel;
Label6: TLabel;
Panel8: TPanel;
DBNavigator2: TDBNavigator;
Splitter1: TSplitter;
Panel9: TPanel;
DBGrid2: TDBGrid;
ToolBar2: TPanel;
Label7: TLabel;
Panel10: TPanel;
DBNavigator3: TDBNavigator;
Query2: TOraQuery;
DataSource2: TDataSource;
Panel3: TPanel;
OraTransaction: TOraTransaction;
btRefresh: TSpeedButton;
Label1: TLabel;
cbGlobalCoordinator: TComboBox;
Panel4: TPanel;
Label2: TLabel;
cbIsolationLevel: TComboBox;
btStartTransaction: TSpeedButton;
btCommit: TSpeedButton;
btRollback: TSpeedButton;
btDetach: TSpeedButton;
btResume: TSpeedButton;
Panel5: TPanel;
Panel6: TPanel;
Label3: TLabel;
edtInactiveTimeOut: TEdit;
Label4: TLabel;
procedure btOpenClick(Sender: TObject);
procedure btCloseClick(Sender: TObject);
procedure btRefreshClick(Sender: TObject);
procedure btStartTransactionClick(Sender: TObject);
procedure btCommitClick(Sender: TObject);
procedure btRollbackClick(Sender: TObject);
procedure btDetachClick(Sender: TObject);
procedure btResumeClick(Sender: TObject);
procedure cbGlobalCoordinatorChange(Sender: TObject);
procedure cbIsolationLevelChange(Sender: TObject);
private
public
procedure Initialize; override;
procedure SetDebug(Value: boolean); override;
procedure SetDirect(Value: boolean); override;
end;
implementation
{$IFDEF CLR}
{$R *.nfm}
{$ENDIF}
{$IFDEF WIN32}
{$R *.dfm}
{$ENDIF}
{$IFDEF LINUX}
{$R *.xfm}
{$ENDIF}
procedure TTransactionFrame.Initialize;
begin
inherited;
TOraSession(Connection).Disconnect; // InternalName should be set before Connect
TOraSession(Connection).InternalName := 'con1';
OraSession2.InternalName := 'con2';
Query1.Connection := Connection;
case OraTransaction.GlobalCoordinator of
gcInternal:
cbGlobalCoordinator.ItemIndex := 0;
{$IFNDEF LINUX}
gcMTS:
cbGlobalCoordinator.ItemIndex := 1;
{$ENDIF}
end;
case OraTransaction.IsolationLevel of
ilReadCommitted:
cbIsolationLevel.ItemIndex := 0;
ilSerializable:
cbIsolationLevel.ItemIndex := 1;
ilReadOnly:
cbIsolationLevel.ItemIndex := 2;
end;
end;
procedure TTransactionFrame.SetDebug(Value: boolean);
begin
Query1.Debug := Value;
Query2.Debug := Value;
end;
procedure TTransactionFrame.SetDirect(Value: boolean);
begin
OraSession2.Options.Direct := Value;
end;
procedure TTransactionFrame.btOpenClick(Sender: TObject);
begin
Query1.Open;
if not OraSession2.Connected then begin
AssignConnectionTo(OraSession2);
OraSession2.Connect;
end;
Query2.Open;
end;
procedure TTransactionFrame.btCloseClick(Sender: TObject);
begin
Query1.Close;
Query2.Close;
end;
procedure TTransactionFrame.btRefreshClick(Sender: TObject);
begin
Query1.Refresh;
Query2.Refresh;
end;
procedure TTransactionFrame.btStartTransactionClick(Sender: TObject);
var
Id: TBytes;
begin
OraTransaction.ClearSessions;
if OraTransaction.GlobalCoordinator = gcInternal then begin
SetLength(Id, 3);
Id[0] := 3;
Id[1] := 2;
Id[2] := 3;
OraTransaction.TransactionId := Id;
SetLength(Id, 1);
Id[0] := 1;
OraTransaction.AddSession(OdacForm.OraSession, Id);
Id[0] := 2;
OraTransaction.AddSession(OraSession2, Id);
OraTransaction.InactiveTimeOut := StrToInt(edtInactiveTimeOut.Text);
end
else begin
OraTransaction.AddSession(OdacForm.OraSession);
OraTransaction.AddSession(OraSession2);
end;
OdacForm.OraSession.Connect;
OraSession2.Connect;
OraTransaction.StartTransaction;
end;
procedure TTransactionFrame.btCommitClick(Sender: TObject);
begin
OraTransaction.Commit;
end;
procedure TTransactionFrame.btRollbackClick(Sender: TObject);
begin
OraTransaction.Rollback;
btRefreshClick(nil);
end;
procedure TTransactionFrame.btDetachClick(Sender: TObject);
begin
OraTransaction.Detach;
btRefreshClick(nil);
end;
procedure TTransactionFrame.btResumeClick(Sender: TObject);
begin
OraTransaction.Resume;
btRefreshClick(nil);
end;
procedure TTransactionFrame.cbGlobalCoordinatorChange(Sender: TObject);
begin
try
case cbGlobalCoordinator.ItemIndex of
0:
OraTransaction.GlobalCoordinator := gcInternal;
{$IFNDEF LINUX}
1:
OraTransaction.GlobalCoordinator := gcMTS;
{$ENDIF}
end;
except
case OraTransaction.GlobalCoordinator of
gcInternal:
cbGlobalCoordinator.ItemIndex := 0;
{$IFNDEF LINUX}
gcMTS:
cbGlobalCoordinator.ItemIndex := 1;
{$ENDIF}
end;
raise;
end;
end;
procedure TTransactionFrame.cbIsolationLevelChange(Sender: TObject);
begin
try
case cbIsolationLevel.ItemIndex of
0:
OraTransaction.IsolationLevel := ilReadCommitted;
1:
OraTransaction.IsolationLevel := ilSerializable;
2:
OraTransaction.IsolationLevel := ilReadOnly;
end;
except
case OraTransaction.IsolationLevel of
ilReadCommitted:
cbIsolationLevel.ItemIndex := 0;
ilSerializable:
cbIsolationLevel.ItemIndex := 1;
ilReadOnly:
cbIsolationLevel.ItemIndex := 2;
end;
raise;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -