OutSystemsにおける排他制御を設計・実装してみた

Pocket

はじめに

 排他処理は、システムを構築する上でデータの整合性を保証するために非常に重要です。プログラムの実行時、複数のプロセスからの同時アクセスにより、競合が発生する可能性のある共有データの整合性を保つ処理を指します。

OutSystemsで、排他制御を設計し・実装した仕組みを解説します。

排他制御の種類

 排他制御には2種類あります。

  • 楽観ロックによる排他制御
     同じデータを他のプロセスではあまり更新しないだろうという、「楽観的」な考え方にもとづく排他制御です。データ取得時に共有資源のロックは行わず、データ更新時に、更新対象データが取得時と同じであるかを比較し、更新を行います。データ比較の方法は、タイムスタンプやデータのバージョン管理を行う方法が一般的です。

 

  • 悲観ロックによる排他制御
     同じデータを他者が頻繁に更新するだろうという、「悲観的」な考え方にもとづく排他制御です。データ読込~更新完了までのあいだ、共有資源に対して他のプロセスに更新を許さない排他制御を行います。更新を行うことでシステム全体に影響を及ぼす重要なデータ、例えば受発注システムにおける在庫データなどに適応します。

排他制御の実装方法

 

楽観ロックによる排他制御

 Entityに「ロックバージョン」項目を持たせ、その「ロックバージョン」により排他制御を実装してみました。DBMSの機能ではなくテーブルの項目を利用し、ロジックにより排他制御を実現しています。

 楽観ロックによる排他制御は、DBMSが持つ日付時刻型(OracleであればTimestamp型、SQLServerであればDatetime2型)により排他制御を行いますが、OutSystemsでは日付時間属性で管理できる最小単位は、DateTime型(yyyy/mm/dd hh:mm:ss)となっており「秒」までとなります。そのため、1秒の間に更新が複数回発生するようなユースケースの場合、DateTime型による排他制御では対応しきれないため、独自項目として「ロックバージョン」(以下図LV)を持たせ、それによる排他制御を行っています。
 楽観ロックを実装した結果、2台の端末(A,B端末)から同時に同じデータ(ID=101)を更新しようとした場合、データの動きは以下のようになります。

① A端末よりID=101のデータを取得
② 同時にロックバージョン(以下LV)値 0を保持
③ B端末よりID=101のデータを取得
④ LV値 0を保持
⑤ A端末から更新前にLV値を再度取得しチェック
⑥ ①LV値=⑤LV値であるため、データ更新
 この時LVをカウントアップ(0→1)して更新
 ※ロックバージョンは更新するごとに1ずつカウントアップ
⑦ B端末から更新前にLV値を再度取得しチェック
 ⑥にて端末がデータ更新しているため、LV値が異なるためエラー

上記手順を図示すると以下のようになります。

 

悲観ロックによる排他制御

 悲観ロックによる排他制御は、更新直前に対象データをDBMSの機能を利用して、行ロックを行ったのちにデータを更新することで、他のプロセスからの更新を排除し排他制御を実現します。

 以下に悲観ロックのイメージを図示します。

 

モジュール構成

 実装した排他制御のイメージをモジュールの構成と役割を説明いたします。

楽観ロック

 

 

悲観ロック

 

まとめ

 OutSystemsにおける排他制御の実装例を記載いたしましたがいかがでしたでしょうか?

 排他制御をどのように考えるかはご理解いただけたと思います。

 この記事を参考にしていただけると幸いです。

お問い合わせ先

執筆者プロフィール

Tadokoro Yasuto
Tadokoro Yasutotdi OutSystems推進室
入社して30年超、わからないことが多く、日々勉強の毎日。
プライベートでは学生時代にはまっていたバンドをまた始めたいと思っている。
Pocket

関連記事