With transaction pattern (langage)

De Wiki1000
Version du 18 mars 2013 à 10:13 par Flfay (discuter | contributions)
(diff) ← Version précédente | Voir la version courante (diff) | Version suivante → (diff)

Le pattern transaction permet d'encapsuler une transaction.

Sommaire

withP transaction do

Ce pattern gère une transaction.

Le code généré par ce pattern est le suivant :

begin
  // with transaction do
  //
  ClassManager.BeginTran;
  try
    //
    glbWorkerPool.BeginParallel;
    try
      h.RunAnonymous(f.sAEntry);
    finally
    glbWorkerPool.EndParallel;
    end;
    //
    ClassManager.Commit([]);
  except
  ClassManager.RollBack;
  raise;
  end;
end;

Exemple d'utilisation :

begin
  // Create an instance
  withP transaction do 
   begin
     inst := MyClass.Create;
     inst.Caption := 'A new instance';
   end;
end;

withP private transaction do

Ce pattern gère une transaction privée.

Le code généré par le pattern est le suivant :

begin
  // withP private transaction do
  //
  old := ClassManager.NewTransContext;
  try
    ClassManager.BeginTran;
    try
      glbWorkerPool.BeginParallel;
      try
        h.RunAnonymous(f.sAEntry);
      finally
      glbWorkerPool.EndParallel;
      end;
      //
      ClassManager.Commit([]);
    except
    ClassManager.RollBack;
    raise;
    end;
  finally
  ClassManager.ActivateContext(old);
  end;
end;

Exemple d'utilisation :

var inst:WFClasseB;
begin
  withP private Transaction do
   for var idx:=1 to 100 do
    begin
     inst := WFClasseB.Create;
     inst.unCode := 'B'+inttostr(index);
     inst.Caption := 'Objet B'+inttostr(index);
    end;
end;

withP long transaction do

Ce pattern gère une transaction longue.

Le code généré par ce pattern est le suivant :

begin
  // with long(batchSize) transaction do
  //
  ClassManager.BeginLongTran(batchSize);
  if batchSize>0 then
   begin
     ClassManager.CurrentTran.AutoBatch := True;
     ClassManager.CurrentTran.AutoBatchOptions := [coDontShowEngineError];
   end;
  try
    {$IFDEF PARALLEL}
    glbWorkerPool.BeginParallel;
    try
    {$ENDIF}
      h.RunAnonymous(f.sAEntry);
    {$IFDEF PARALLEL}
    finally
    if not glbWorkerPool.EndParallel(E) then raise E;
    end;
    {$ENDIF}
 
    ClassManager.CommitLongTran([coDontShowEngineError,coNoConfirmDialog]);
  except
  ClassManager.RollBackLongTran;
  raise;
  end;
end;

Exemple d'utilisation :

// Long transaction with default batch size
var inst:WFClasseB;
begin
  withP long(100) Transaction do
   for var idx:=1 to 100 do
    begin
     inst := WFClasseB.Create;
     inst.unCode := 'B'+inttostr(index);
     inst.Caption := 'Objet B'+inttostr(index);
    end;
end;
 
// Long transaction with a batch size of 100
var inst:WFClasseB;
begin
  withP long(100) Transaction do
   for var idx:=1 to 100 do
    begin
     inst := WFClasseB.Create;
     inst.unCode := 'B'+inttostr(index);
     inst.Caption := 'Objet B'+inttostr(index);
    end;
end;
Tip-20px.png Tip : Les patterns gérant des transactions longues utilisent le mode AutoBatch

withP private long transaction do

Ce pattern gère une transaction longue privée.

Le code généré par ce pattern est le suivant :

begin
  // with privateP long(batchSize) transaction do
  //
  old := ClassManager.NewTransContext;
  try
    ClassManager.BeginLongTran(batchSize);
    if batchSize>0 then
     begin
       ClassManager.CurrentTran.AutoBatch := True;
       ClassManager.CurrentTran.AutoBatchOptions := [coDontShowEngineError];
     end;
    try
      {$IFDEF PARALLEL}
      glbWorkerPool.BeginParallel;
      try
      {$ENDIF}
        h.RunAnonymous(f.sAEntry);
      {$IFDEF PARALLEL}
      finally
      if not glbWorkerPool.EndParallel(E) then raise E;
      end;
      {$ENDIF}
      //
      ClassManager.CommitLongTran([coDontShowEngineError,coNoConfirmDialog]);
    except
    ClassManager.RollBackLongTran;
    raise;
    end;
  finally
  ClassManager.ActivateContext(old);
  end;
end;
Outils personnels