シリアル化を使用すると、一度に 1 つずつ実行されるトランザクションの影響をテストできます。 これは、たとえば、同時に多数のログインを処理できないサーバーに接続する際に役立ちます。
ユーザーおよびトランザクションをシリアル化するには、トークンまたはミューテックスのオブジェクトを使用する必要があります。 名前付きミューテックス オブジェクトは、CreateMutex 関数を呼び出すことによって作成されます。 同期されるユーザーは、ミューテックス オブジェクトを受け取るまで待機する必要があります。 これによって、一度に 1 ユーザーのみがトランザクションを実行することが保証されます。
ユーザーは、トランザクションを完了したら、ReleaseMutex 関数を呼び出すことによって、トークンを開放する必要があります。 これによって、その他のユーザーが、ミューテックス オブジェクトを使用できるようになります。
トランザクションおよびユーザーをシリアル化するために、以下の関数が使用されます。
以下の例は、Silk Performer のインストール ディレクトリの Samples\Database フォルダにある Mutexlogin.bdf というサンプル スクリプトから引用しています。 このスクリプトは、3 つのトランザクションから構成されています。 TMain は、ユーザーがトークンを受け取るまで待機してから、DBMS に接続します。Selling は、データベース トランザクションを実行します。CleanUp は、データベースへの接続を切断して、すべてのリソースを開放します。
最初に、トランザクション内の重要なセクションへのアクセスをシリアル化するために、MyConnectMutex というミューテックス オブジェクトが、複数の同時ユーザーに対して作成されます。 WaitForSingleObject 関数を呼び出すと、ミューテックス オブジェクトが合図を出している状態になるまで遅延が発生します。 これは、その時点から現在のトランザクションのみが実行され、この状態はトークンが開放されるまで続くことを意味します。 実行時に、データベース システムへの接続が確立されます。 正常に接続されると、ミューテックス オブジェクトの所有権が開放されます。 これらのステップが正常に完了すると、トランザクションがコミットされます。 この例では、データベース システムへの接続のみがシリアル化されます。
benchmark MutexLogin
use "dbapi.bdh"
var
gHdbc1 : number; // handle for database connection
gHMutex : number; // mutex handle
dcluser
user
Seller
transactions
TMain : begin;
Selling : 50;
CleanUp : end;
dcltrans
transaction TMain
var
str: string;
begin
// SYNC: serialize connect transaction with mutex object
// (enter critical section)
gHMutex := CreateMutex("MyConnectMutex");
WaitForSingleObject(gHMutex, INFINITE);
gHdbc1 := DB_Connect("dsn=sqs_purple;uid=u1;pwd=u1");
Print("Connected!", 1, 1);
// SYNC: leave critical section and pass control to other user
ReleaseMutex(gHMutex);
end TMain;
// process database transaction
transaction Selling
begin
...
end Selling;
transaction CleanUp
begin
DB_Disconnect(gHdbc1);
end CleanUp;