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