同期

同期は、同時に多数のトランザクションを呼び出したときの影響をテストする際に役立ちます。 同期を使用することによって、同時実行に関する特殊な問題をテストするために、システムにストレスをかけることができます。 同期は、レースを開始するときの合図のように作用する Event Starter と呼ばれる追加のユーザーを利用することによって動作します。 CreateEvent 関数を使用すると、Event Starter ユーザーを使用して、指定された時間が経過した後にイベント オブジェクトを送信できます。 シミュレーションで使用するユーザーがこのイベントを待機するようにセットアップすることによって、イベントが開放されたときに、指定されたトランザクションを同時に実行できます。 Silk Performer は、PulseEvent 関数をこの目的で提供します。

その他のユーザーは、WaitForSingleObject 関数を呼び出して、指定されたイベントが合図が出された状態になるまで待機します。 WaitFor 関数を使用すると、イベント オブジェクトを使用せずにユーザー間で相互に同期できます。

同期関数

トランザクションおよびユーザーを同期するために、以下の関数が使用されます。

  • CreateEvent
  • PulseEvent
  • WaitFor
  • WaitForSingleObject
  • CloseHandle

同期のサンプル スクリプト

以下の例では、ユーザーは、StarterEvent というイベント オブジェクトを作成して、FTP サーバーへの接続を確立します。 Starter ユーザーは、イベント オブジェクト StarterEvent の状態を 10 秒ごとに合図するように設定し、該当する数の待機しているユーザーがトランザクションを処理した後にリセットします。 このようにして、すべての Uploader ユーザーは、TUpload トランザクションを同時に実行するように強制されます。 Uploader は、イベント オブジェクトが合図が出された状態になるまで待機してから、Upload トランザクションを実行します。

dcluser
  user
    Starter
  transactions
    TInit : begin;
    TStartEvent : 20;
  user
    Uploader
  transactions
    TInit : begin;
    TUpload : 20;
var
  hEventGo : number; // handle for starting event
  hFTP : number;

dcltrans
  transaction TInit
  begin
    hEventGo := CreateEvent("StarterEvent");
    WebFtpConnect(hFTP, "standardhost", WEB_PORT_FTP, "username", "password");
  end TInit;

  transaction TStartEvent
  begin
    wait 10.0;
    // every 10 seconds the starter event forces all
    // seller users to execute the selling transaction
    // at the same time
    PulseEvent(hEventGo);
  end TStartEvent;
  
  transaction TUpload
  begin
    WaitForSingleObject(hEventGo, INFINITE);
    WebFtpPut(hFTP, 4096, "test.dat", true);
  end TUpload;