With transaction pattern (langage)

De Wiki1000

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 :

begin
end;

withP private long transaction do

Ce pattern gère une transaction longue privé.

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;

Exemple d'utilisation :

begin
end;
Outils personnels