GS2-Lock

排他処理管理を GS2 SDK for Unity から利用する手順を解説します。

ロックプールを作成する

GS2マネージメントコンソールの GS2-Lock から新しくロックプールを作成します。

../../../_images/スクリーンショット_2018-02-21_15.19.32.png

『ロックプールの新規作成』をクリックします。

../../../_images/スクリーンショット_2018-02-21_15.19.41.png

ロックプールの名前などを指定して登録します。

これで、GS2マネージメントコンソールでおこなう準備は完了です。

ロックを取得する

yield return Gs2.Lock.Lock(
    r =>
    {
        if (r.Error != null)
        {
            // 例外が発生
        }
    },
    Session,            // ゲームセッション
    LockPoolName,       // ロックプール名
    "resource-0001",    // ロックを取得するリソース名
    "transaction-0001", // トランザクションID
    5                   // ロックの有効期限()
    );

ロックを取得するリソース名 には ウォレットのID などを指定して使用します。

トランザクションID には現在行っている処理系のIDを指定します。通常 UUID を指定するのがいいでしょう。

同一トランザクションIDを使ってロックを取得すると、ロック参照カウンターが増加し、トランザクションIDが異なるとロック取得エラーが発生します。

アンロック時には参照カウンターを減らし、参照カウンターが 0 になると実際にリソースが解放されます。

これは、1つの処理系の中で同じリソースのロックを複数回取得するような処理を記述したときに

2回目以降のロック取得が失敗してしまい、意図した動作にならなくなってしまうことを防ぐ目的があります。

ロックの有効期限(秒) にはロックを取得した後、アンロックしなかった場合に何秒経過したらロックを強制的に解除するかを指定出来ます。

ロックを取ったまま解除しない不具合があったときにリソースが触れなくなってしまうような事態を避ける目的があります。

ロックを解除する

yield return Gs2.Lock.Unlock(
    r =>
    {
        if (r.Error != null)
        {
            // 例外が発生
        }
    },
    Session,            // ゲームセッション
    LockPoolName,       // ロックプール名
    "resource-0001",    // ロックを取得するリソース名
    "transaction-0001", // トランザクションID
);

ロックの解除のパラメータはほぼ取得時と同じです。

気をつけなければならない点としては、トランザクションIDにはロック取得時に使用したトランザクションIDと同じものを指定する必要がある点です。

これは、他の処理系から誤ってロックが解除されてしまうことを防ぐためにそのような設計となっています。