見出し画像

Power Appsのススメ 〜雑談2〜 データソース更新タイミング

コネクタと使って外部データを処理する際に、Collect(追加挿入)、Update(レコードの更新)、Patch(カラムの更新)を呼び出すのですが、その際、他のアプリやユーザーが同じデータを扱っていた場合、一方の更新内容が反映されないケースがあります。

更新タイミングで変わる

上図のように2つのアプリで同じデータを読み込んで(AとA')、それぞれがデータを更新すると、結果はどうなるでしょうか?

まず、アプリ側の処理がCollect(追加挿入)だった場合、Bが先になると「3 バナナ Banana」が記録され、その後で「3 ぶどう Grape」が続きます。

B'が先なら逆になります。

片方のデータが上書きされるわけではなさそうなのですが、先頭の数字を自前で制御してインデックスとして使いたい場合、同じ数字が並ぶのは困るので、なんとかしたいところです。

参照と更新のタイミング

インデックスを自前で追加するには、直前のデータがいくつあるかを知らないとなりません。

Power Appsのコネクタはキャッシュ(バッファ?)を持っているので、処理中に他のアプリがデータソースを更新しても、キャッシュの内容は古いままとなるため、先のような競合が起きる可能性があります。

SQLを介したデータベース処理では、更新時にテーブルやレコードをロックして整合性を保つことができますが、Power Appsのコネクタベースの記述ではそういったことはできません。

そこで、できる限り競合が起きないよう、追加や更新を行う直前に、最新のデータをRefresh関数で読み直してから処理をするようにします。

もちろん、他のアプリやユーザーがデータを更新していた場合に備えてチェック項目はしっかり把握して実装しておく必要はあります。

排他処理を他のデータソースを使う、ということも考えてはみたものの、トランザクションの概念がなく、Redisのように1命令でデータそのものをインクリメント/デクリメントしてくれる機能もないので諦めました。

同時更新を避ける設計に

こういった経緯もあって、同時更新はとにかく避ける、同時更新されても問題のないデータ構造にする、といった設計思想が必要になります。

また、頻繁に更新処理が行われないような工夫も必要です。

なるべく更新処理は一括して、短時間で済ますような設計・実装にしておくことをお勧めします。

この記事が気に入ったらサポートをしてみませんか?