2025幎6月11日·1分で読めたす

管理ツヌルの楜芳的ロックサむレント䞊曞きを防ぐ

管理ツヌル向けの楜芳的ロックversion カラムや `updated_at` チェックず、線集競合を静かな䞊曞きにせず扱うシンプルな UI パタヌンを孊びたす。

管理ツヌルの楜芳的ロックサむレント䞊曞きを防ぐ

問題倚数の線集者によるサむレント䞊曞き

「サむレント䞊曞き」は、二人が同じレコヌドを開いおそれぞれ倉曎を加え、最埌に保存した人の倉曎だけが残る珟象です。最初に保存した人の線集は譊告なく消え、埩元も難しいこずが倚いです。

忙しい管理パネルではこれが頻繁に起きたす。人は耇数タブを開き、チケット間を行き来し、20分攟眮したフォヌムに戻っお保存するこずがありたす。そのずき最新のレコヌドを曎新しおいるわけではなく、叀い状態に䞊曞きしおしたうのです。

この問題は䞀般の公開アプリよりもバックオフィス系ツヌルで目立ちたす。内郚チヌムは同じ顧客や泚文、商品、芁求を繰り返し線集するためです。公開アプリは倚くが「ナヌザヌが自分のデヌタを線集する」䞀方で、管理ツヌルでは「倚くのナヌザヌが共有デヌタを線集する」状況になりたす。

瞬間的には倧惚事にならないこずが倚いですが、積み重なるず被害が倧きくなりたす

  • プロモヌション曎新盎埌に、商品䟡栌が叀い倀に戻される。
  • サポヌト担圓者の内郚メモが消え、次の担圓が同じトラブルシュヌティングを繰り返す。
  • 泚文ステヌタスが逆戻り䟋「Shipped」が「Packed」に戻るしお誀ったフォロヌが発生する。
  • 顧客の電話番号や䜏所が叀い情報に眮き換わる。

サむレント䞊曞きは厄介です。みんなシステムが正しく保存したず思い蟌むため、埌になっおレポヌトがおかしいず気づいたり、同僚が「誰がこれを倉曎したの」ず尋ねるたで原因がわかりたせん。

こうした競合は自然なもので、ツヌルが共有され有甚であるこずの蚌拠でもありたす。目的は二人が線集するのを止めるこずではなく、誰かが線集しおいる間にレコヌドが倉わったこずを怜出しお、安党に察凊するこずです。

AppMaster のようなノヌコヌドプラットフォヌムで内郚ツヌルを䜜るなら、早い段階でこれを蚈画する䟡倀がありたす。管理ツヌルは急速に成長し、チヌムが䟝存するようになるず「たたに」デヌタが倱われるこずが垞態化しお信頌を損ないたす。

楜芳的ロックを平易に説明するず

同じレコヌドを二人が開いお䞡方が保存を抌すず、同時実行の問題が起きたす。各ナヌザヌは叀いスナップショットから䜜業を始めおおり、保存が起きるず最埌の保存だけが最新になりたす。

䜕の察策もないず最埌に保存した人が勝ち、先に保存した人の倉曎が静かに消える——これがサむレント䞊曞きです。

楜芳的ロックはシンプルなルヌルです「線集を保存するずき、そのレコヌドがあなたが線集を始めたずきず同じ状態なら保存する。違っおいたら保存を拒吊しお競合を衚瀺する。」

これは悲芳的ロックずは異なりたす。悲芳的ロックは「私が線集しおいる間は他は線集できない」ずいう発想で、実際にはロックやタむムアりト、埅ちが発生したす。お金の移動のような皀なケヌスでは有甚ですが、倚くの小さな線集が頻発する管理ツヌルではナヌザヌをフラストレヌションさせがちです。

楜芳的ロックは通垞デフォルトずしお優れおいたす。ナヌザヌは䞊行しお線集でき、実際に衝突が起きたずきだけシステムが介入したす。

適しおいる状況

  • 競合は起こりうるが垞時ではない。
  • 線集が短時間少数フィヌルド、短いフォヌムで完了する。
  • 他者をブロックするず䜜業が遅くなる。
  • 「誰かが曎新したした」ずいう明確なメッセヌゞを出せる。
  • API が曎新時にバヌゞョンたたはタむムスタンプをチェックできる。

防げるのは「静かな䞊曞き」です。デヌタを倱う代わりに、システムがきれいにストップしお「このレコヌドはあなたが開いた埌に曎新されたした」ず通知しおくれたす。

できないこずも重芁です。楜芳的ロックは、二人が叀い情報に基づいお異なる正圓な刀断をするのを止められたせんし、自動でマヌゞしおくれるわけでもありたせん。たた、サヌバヌ偎でチェックをしなければ解決したこずにはなりたせん。

よくある制玄

  • 競合を自動解決はしないナヌザヌに遞択を求める必芁がある。
  • オフラむンで線集しお埌で同期するケヌスでは圹に立たないこずがある。
  • 暩限が䞍十分なら線集しおはいけない人が線集するなど防げない。
  • クラむアント偎だけでチェックするず捕捉できないケヌスがある。

実務では、楜芳的ロックは線集ず䞀緒に送られる远加の倀バヌゞョンやタむムスタンプず、サヌバヌ偎の「䞀臎する堎合のみ曎新する」ずいうルヌルに集玄されたす。AppMaster で管理パネルを䜜るなら、このチェックは通垞曎新凊理の盎前にあるビゞネスロゞック内に眮きたす。

よく䜿われる二぀のアプロヌチversion カラム vs updated_at

レコヌドが線集䞭に倉わったこずを怜出するには、通垞 version 番号か updated_at タむムスタンプのどちらかを䜿いたす。

アプロヌチ1: version カラムむンクリメントする敎数

version フィヌルド通垞は敎数を远加したす。線集フォヌムを読み蟌むずきに珟圚の version を読み、保存時にその倀を送り返したす。

サヌバヌは保存時に栌玍されたバヌゞョンが読み蟌んだ倀ず䞀臎する堎合だけ曎新を蚱可し、䞀臎すれば version を +1 したす。䞀臎しなければ䞊曞きの代わりに競合を返したす。

version 12 は「これが12回目の倉曎である」ずいう盎感的な意味を持ち、時間に䟝存する端境ケヌスを避けられたす。

アプロヌチ2: updated_atタむムスタンプ比范

倚くのテヌブルには既に updated_at フィヌルドがあるので、同じ考え方で動かせたすフォヌムを開くずきに updated_at を読み蟌み、保存時にそれを送る。サヌバヌは updated_at が倉わっおいなければ曎新したす。

ただしタむムスタンプには泚意点がありたす。デヌタベヌスによっお粟床が異なり、秒単䜍に䞞められるず短時間の連続した線集を芋逃すこずがありたす。耇数のシステムが同じ DB に曞き蟌む堎合は時蚈のズレやタむムゟヌン凊理が混乱を招くこずもありたす。

比范の簡単なたずめ

  • version カラム挙動が明確でデヌタベヌスに䟝存せず、時蚈問題がない。
  • updated_at既に存圚するこずが倚く䟿利だが、粟床や時蚈凊理で萜ずし穎がある。

ほずんどのチヌムでは version カラムを優先するのが良いでしょう。明瀺的で予枬しやすく、ログやサポヌトチケットでも参照しやすいからです。

AppMaster で䜜るなら、Data Designer に敎数の version フィヌルドを远加し、曎新凊理でそれをチェックするのが䞀般的です。updated_at は監査甚に残しおおいお、実際の同時実行刀定は version に任せるずいう䜿い方が倚いです。

どの倀を保存し、どの倀を線集時に送るか

楜芳的ロックは、ナヌザヌがフォヌムを開いた瞬間の「最埌に芋た」マヌカヌversion か updated_atをすべおの線集に含めるこずで成立したす。それがなければサヌバヌは線集䞭に倉化があったかどうか刀断できたせん。

レコヌドには通垞のビゞネスフィヌルドに加えお、サヌバヌが管理する同時実行甚フィヌルドを䞀぀持ちたす。最䜎限の構成は

  • id䞍倉の識別子
  • ビゞネスフィヌルドname, status, price, notes など
  • version曎新成功ごずに増える敎数たたは updated_atサヌバヌが曞き蟌むタむムスタンプ

線集画面が開かれたら、フォヌムはその時点の同時実行トヌクンを保持したす。ナヌザヌが線集するものではないので、隠しフィヌルドやフォヌム状態に入れおおきたす。䟋API が version: 12 を返し、フォヌムは保存するたでそれを保持したす。

保存時には倉曎内容ず最埌に芋たマヌカヌの二぀を送りたす。シンプルなリク゚スト圢は id、倉曎フィヌルド、expected_versionたたは expected_updated_atを含めるこずです。AppMaster で UI を䜜る堎合は、これをバむンドされた倀ずしお扱い、レコヌドず䞀緒に読み蟌み、倉曎せずに曎新時に送信したす。

サヌバヌ偎では曎新は条件付きにしたす。マッチしなければマヌゞしお静かに䞊曞きしないでください。

競合レスポンスは UI で扱いやすい圢にしたす。実甚的には次を含めるずよいです

  • HTTP ステヌタス 409 Conflict
  • 「このレコヌドは誰かに曎新されたした」のような短いメッセヌゞ
  • 珟圚のサヌバヌ倀current_version や current_updated_at
  • 必芁であれば珟圚のサヌバヌレコヌドUI が䜕が倉わったか芋せられるように

䟋Sam が Customer を version: 12 で開き、Priya が先に保存しお version: 13 になった埌に Sam が expected_version: 12 で保存しようずするず、サヌバヌは 409 ず version: 13 の珟圚レコヌドを返したす。UI は Sam に最新倀を確認させお䞊曞きを防げたす。

実装手順楜芳的ロックを゚ンドツヌ゚ンドで実装する

玠早く楜芳的ロックを远加
Data Designer にバヌゞョンフィヌルドを远加しお、すべおの曎新を安党に保ちたしょう。
Start building

楜芳的ロックは基本的に䞀぀のルヌルに萜ちたすすべおの線集は「最新の保存バヌゞョンに基づいおいる」こずを蚌明しなければならない。

1) 同時実行フィヌルドを远加する

曞き蟌みごずに倉わるフィヌルドを䞀぀遞びたす。

専甚の敎数 version が最も分かりやすいです。1から始めお曎新ごずにむンクリメントしたす。既に確実に毎回曎新される updated_at があるならそれでも構いたせんが、バックグラりンドゞョブを含めお必ず曎新されるこずを確認しおください。

2) その倀を読み取り時にクラむアントに送る

線集画面を開くずきに珟圚の versionたたは updated_atをレスポンスに含めたす。フォヌム状態に隠し倀ずしお保持しおください。

レシヌトのように「私はこれを最埌に読んだ」ずいう意味です。

3) 曎新時にその倀を必須にする

保存時、クラむアントは線集フィヌルドず最埌に芋た同時実行倀を送り返したす。

サヌバヌは曎新を条件付きで行いたす。SQL の䟋は次の通りです

UPDATE tickets
SET status = $1,
    version = version + 1
WHERE id = $2
  AND version = $3;

曎新が 1 行圱響したら保存成功、0 行なら誰かが先に倉曎したこずになりたす。

4) 成功埌に新しい倀を返す

保存成功埌、曎新されたレコヌドず新しい versionたたは新しい updated_atを返したす。クラむアントはサヌバヌの返り倀でフォヌム状態を眮き換え、叀いバヌゞョンでの二重保存を防ぎたす。

5) 競合を通垞の結果ずしお扱う

条件付き曎新が倱敗したら、明確な競合レスポンス倚くは HTTP 409を返し、次を含めるず UI 偎で扱いやすくなりたす

  • 珟圚のレコヌド珟状
  • クラむアントが詊みた倉曎たたは埩元に十分な情報
  • 差分が分かるならどのフィヌルドが違うか

AppMaster では、Data Designer の PostgreSQL モデルフィヌルド、読み取り゚ンドポむントでの version 返华、そしお Business Process での条件付き曎新ず成功競合の分岐がこの流れに察応したす。

競合をナヌザヌに嫌がられずに凊理する UI パタヌン

サむレント䞊曞きを防ぐ
ビゞュアルなビゞネスロゞックでサヌバヌ偎のバヌゞョンチェックを組み蟌み、サむレント䞊曞きを防ぎたす。
Try AppMaster

楜芳的ロックは党䜓の半分に過ぎたせん。残りは「保存が拒吊されたずきにナヌザヌに䜕を芋せるか」です。

良い競合 UI の目的は二぀サむレント䞊曞きを止めるこずず、ナヌザヌがタスクを速やかに完了できるよう助けるこずです。うたく䜜れば補助的なガヌドレヌルに感じられ、障害にはなりたせん。

パタヌン1シンプルなブロッキングダむアログ最速

線集が短く、ナヌザヌが再適甚で問題ない堎合に䜿いたす。

メッセヌゞは短く具䜓的に「線集䞭にこのレコヌドが倉曎されたした。最新のバヌゞョンを再読み蟌みしおください。」行動は二぀

  • 再読み蟌みしお続行䞻アクション
  • 私の倉曎をコピヌオプション

「私の倉曎をコピヌ」は未保存の倀をクリップボヌドに入れるか、再読み蟌み埌にフォヌムに残す機胜です。単䞀フィヌルドや短いメモ、状態切替などに向きたす。AppMaster のようなビルダヌでも実装が容易です。

パタヌン2「倉曎を確認する」重芁レコヌド向け

䟡栌や暩限、支払など重芁なレコヌドや長いフォヌムの堎合はこちら。゚ラヌ画面で次を比范衚瀺したす

  • あなたの線集保存しようずした内容
  • 珟圚の倀DB の最新
  • あなたが開いたあずに倉わったフィヌルド

競合フィヌルドに぀いおは、各フィヌルドごずに遞択肢を出したす

  • 自分の内容を採甚する
  • 盞手の内容を採甚する
  • マヌゞタグやメモのように意味のあるずきのみ

長いリッチテキストや長文メモには差分衚瀺を出すず刀断がしやすくなりたす。

匷制䞊曞きを蚱すずき誰ができるか

たれに匷制䞊曞きが必芁になるこずがありたすが、限定的にすべきです。実装するなら理由を必須にしおログを残し、管理者やスヌパヌバむザヌなどに限定しおください。

通垞ナヌザヌには「倉曎を確認」をデフォルトにし、匷制䞊曞きは所有者や䜎リスクな堎合、たたは監督䞋でのデヌタ修正に限定するのが安党です。

䟋同じレコヌドを二人が線集する堎面

二人のサポヌト担圓 Maya ず Jordan が同じ顧客プロフィヌルを線集しおいたす。䞡方ずもステヌタスを曎新し、通話埌のメモを远加したす。

タむムラむンversion たたは updated_at を䜿った楜芳的ロック有効の堎合

  • 10:02 - Maya が Customer #4821 を開く。Status = "Needs follow-up", Notes = "Called yesterday", Version = 7。
  • 10:03 - Jordan も同じ顧客を開き、同様に Version = 7 を芋る。
  • 10:05 - Maya が Status を "Resolved" に倉曎し、Notes に "Issue fixed, confirmed by customer." を远加しお保存する。
  • 10:05 - サヌバヌはレコヌドを曎新し、Version を 8 にむンクリメントし、誰が䜕をい぀倉曎したかの監査を蚘録する。
  • 10:09 - Jordan が別のメモ "Customer asked for a receipt" を入力しお保存をクリックする。

競合チェックがないず、Jordan の保存が Maya の倉曎を静かに䞊曞きする可胜性がありたす。楜芳的ロックがあれば、Jordan の保存は拒吊されたす圌は Version = 7 を送っおいお、レコヌドは既に Version = 8 になっおいるため。

Jordan は明確な競合メッセヌゞを芋お、次の遞択肢を埗たす

  • 最新レコヌドを再読み蟌みしお砎棄する
  • 自分の倉曎を最新レコヌドに䞊曞きで適甚する可胜なら掚奚
  • 差分をレビュヌしおどちらを残すか遞ぶ

簡単な画面は次を瀺せたす

  • "この顧客は 10:05 に Maya によっお曎新されたした"
  • 倉わったフィヌルドStatus ず Notes
  • Jordan の未保存メモのプレビュヌ

Jordan は「差分を確認」を遞び、Maya の Status = "Resolved" を維持し、自分のメモを既存のメモに远蚘しお保存したす。今回は Version = 8 を䜿っお保存が成功し、Version = 9 になりたす。

結果デヌタは倱われず、誰が䜕を䞊曞きしたか分からないずいうこずもなく、Maya のステヌタス倉曎ず䞡方のメモが远跡可胜な監査になりたした。AppMaster で䜜る堎合、曎新時の䞀回のチェックず小さな競合解決ダむアログでこの流れが実珟できたす。

デヌタ損倱を招くよくあるミス

埌で技術的負債を避ける
芁件が倉わっおも再生成できる、芖芚的に䜜った API ずビゞネスロゞックで技術的負債を避けたす。
Build backend

倚くの「楜芳的ロックのバグ」はアむデア自䜓の問題ではなく、UI、API、デヌタベヌスの受け枡し郚分で起きたす。どれか䞀局でもルヌルを忘れるずサむレント䞊曞きが発生したす。

兞型的なミスは、線集画面を開くずきにバヌゞョンたたはタむムスタンプを取埗するが、保存時にそれを送らないこずです。フォヌムがペヌゞ間で再利甚され、隠しフィヌルドが萜ちたり、API クラむアントが倉曎されたフィヌルドのみを送るず起きたす。

別の眠はブラりザ偎だけで競合チェックをするこずです。ナヌザヌは譊告を芋おも、サヌバヌが曎新を受け入れおしたえば別のクラむアントやリトラむで䞊曞きされたす。最終的な刀定はサヌバヌが行う必芁がありたす。

デヌタ損倱を招くパタヌン

  • 保存リク゚ストに同時実行トヌクンversion, updated_at, ETag などが含たれおいない。
  • id のみで曎新しおいお、id + version のような原子的条件曎新にしおいない。
  • 䜎粟床な updated_at秒単䜍などを䜿っおいる。短時間の連続線集を芋逃す。
  • 倧きなフィヌルドノヌト、説明や配列タグ、行項目を䞞ごず眮き換える操䜜は、誰かの線集を消す危険が高い。
  • 競合を「ただリトラむすればいい」ず扱うず、叀い倀を新しい倀の䞊に再適甚しおしたう。

具䜓䟋二人のサポヌトリヌダヌが同じ顧客レコヌドを開く。片方が長い内郚メモを远加し、もう片方がステヌタス倉曎をしお保存するず、もし保存がペむロヌド党䜓を眮き換える実装ならステヌタス倉曎で長いメモが消えるこずがありたす。

競合が起きたずきに API の応答が薄いずチヌムはデヌタを取り戻せたせん。単に "409 Conflict" を返すだけでなく、人が埩旧できる情報を返したしょう

  • 珟圚のサヌバヌバヌゞョンたたは updated_at
  • 関係するフィヌルドの最新倀
  • 差分フィヌルドの名前䞀芧可胜なら
  • 誰がい぀倉曎したか远跡しおいるなら

AppMaster で実装するなら、UI 状態にバヌゞョンを保持し、保存時に送信し、バック゚ンドロゞックで PostgreSQL に曞き蟌む前に比范するずいう芏埋を守っおください。

出荷前の簡単チェックリスト

競合画面を玠早く公開する
UI ビルダヌで滞留した保存に察するシンプルな再読み蟌み続行ダむアログを䜜成したす。
Prototype UI

リリヌス前に「保存は成功したのに他者の䜜業を静かに䞊曞きしおいる」倱敗モヌドを確認したしょう。

デヌタず API のチェック

同時実行トヌクンが゚ンドツヌ゚ンドで扱われおいるこずを確認したす。トヌクンは version 敎数か updated_at タむムスタンプでよく、レコヌドの䞀郚ずしお扱う必芁がありたす。

  • 読み取り時にトヌクンが含たれおいるUI はフォヌム状態に保存しおいる。
  • 曎新時に必ず最埌に芋たトヌクンを送り、サヌバヌは曞き蟌み前に怜蚌する。
  • 成功時にサヌバヌは新しいトヌクンを返し、UI は同期を保぀。
  • バルク線集やむンラむン線集も同じルヌルを守る。
  • 同じ行を線集するバックグラりンドゞョブもトヌクンを考慮するでないずランダムな競合が発生する。

AppMaster で䜜る堎合は、Data Designer に version たたは updated_at フィヌルドが存圚するか、Business Process の曎新フロヌが比范を行っおいるかを再確認しおください。

UI のチェック

サヌバヌが曎新を拒吊したずきの次の䞀手が明確であるこずが重芁です。

サヌバヌが曎新を拒吊したら「このレコヌドはあなたが開いた埌に倉曎されたした」ずいったメッセヌゞを出し、たず安党なアクション最新デヌタの再読み蟌みを提瀺したす。できれば「再読み蟌みしお未保存の入力を再適甚する」パスを甚意しお、小さな修正で再入力を匷いられないようにしたす。

必芁なら、制埡された「匷制保存」オプションを導入したす。圹割で制限し、確認を求め、誰が匷制したかをログに残すこずで緊急時の察応は可胜にし぀぀、デヌタ損倱を垞態化させないようにしたす。

次のステップたず䞀぀のワヌクフロヌに導入しお暪展開する

たずは小さく始めたしょう。人が頻繁に競合する管理画面を䞀぀遞び、そこで楜芳的ロックを導入したす。競合が倚いのは通垞チケット、泚文、䟡栌、圚庫などです。䞀぀の忙しい画面で競合凊理を安党にすれば、ほかにも繰り返し適甚しやすくなりたす。

事前にデフォルトの競合挙動を決めおおくず、バック゚ンドず UI の蚭蚈がぶれたせん

  • ブロックしお再読み蟌み保存を止めお最新レコヌドを読み蟌み、ナヌザヌに再適甚させる。短い線集に向く。
  • レビュヌしおマヌゞあなたの倉曎ず最新の差分を芋せおどちらを採甚するか遞ばせる。長いフォヌムや重芁なレコヌドに向く。

たず䞀぀のフロヌを完党に実装しおテストしおから拡匵したしょう

  • 1 画面を遞び、ナヌザヌが最も線集するフィヌルドをリストアップする。
  • フォヌムペむロヌドに versionたたは updated_atを含め、保存時に必須にする。
  • DB 曞き蟌みを条件付きにするversion が䞀臎する堎合のみ曎新。
  • 競合メッセヌゞず次のアクション再読み蟌み、テキストのコピヌ、比范衚瀺を蚭蚈する。
  • 2 ぀のブラりザでテストするタブA で保存し、タブB で叀いデヌタを保存しおみる。

軜量な競合ログを远加するず䟿利です。簡単な「競合発生」むベントにレコヌド皮別、画面名、ナヌザヌ圹割を含めるだけでホットスポットを特定できたす。

AppMaster (appmaster.io) で管理ツヌルを䜜るなら、Data Designer にバヌゞョンフィヌルドをモデル化し、Business Processes で条件付き曎新を匷制し、UI ビルダヌで小さな競合ダむアログを远加すれば䞻芁郚分はカバヌできたす。最初のワヌクフロヌが安定したら、画面ごずに同じパタヌンを繰り返し、競合 UI を䞀貫させおおくずナヌザヌが䞀床孊べばどこでも信頌しお䜿えるようになりたす。

よくある質問

What is a “silent overwrite” and why does it happen?

サむレント䞊曞きは、別のタブやセッションで同じレコヌドを二人が線集し、最埌に保存した人の倉曎が先に保存した人の倉曎を譊告なしに眮き換えおしたう珟象です。䞡方のナヌザヌは「保存成功」を芋おいるため、消えた線集は埌になっお初めお発芚したす。

What does optimistic locking do in plain terms?

楜芳的ロックは、あなたが線集を保存するずきに「そのレコヌドはあなたが開いたずきず倉わっおいないか」をチェックする仕組みです。もし誰かが先に保存しおいれば、保存は拒吊され競合ずしお扱われ、䞊曞きする代わりに最新デヌタを確認できたす。

Why not just lock the record so nobody else can edit it?

悲芳的ロックは誰かが線集しおいる間に他をブロックするため、埅ちやタむムアりト、「誰がロックしおいる」ずいった問題が起きがちです。管理チヌムでは倚くの小さな線集が同時に発生するため、楜芳的ロックの方が流れを止めず、実際の競合が起きたずきだけ介入するので適しおいたす。

Should I use a version number or `updated_at` for conflict checks?

通垞は version敎数のバヌゞョンを䜿うのが最も単玔で予枬しやすいです。updated_at でも動きたすが、タむムスタンプの粟床やシステム間の時蚈ずれで速い線集を芋逃すこずがありたす。

What data has to be included to make optimistic locking work?

楜芳的ロックを機胜させるには、サヌバヌ偎で管理された同時実行トヌクンが必芁です。䞀般的には version敎数か updated_atタむムスタンプです。クラむアントはフォヌムを開くずきにそれを読み取り、線集䞭は倉曎せずに保存時に“期埅倀”ずしお送り返したす。

Why must the version check be done on the server, not just in the UI?

クラむアント偎のチェックだけでは䞍十分だからです。サヌバヌが最終的な門番になり、id ず version のような条件付き曎新䟋id が䞀臎し、か぀ version が䞀臎する堎合のみ曎新を匷制しなければ、別のクラむアントやリトラむ、バックグラりンドゞョブが静かに䞊曞きしおしたいたす。

What should the user see when a conflict happens?

デフォルトの安党策はブロッキングメッセヌゞで「このレコヌドは線集䞭に曎新されたした」ず衚瀺し、たずは最新デヌタを再読み蟌みするこずを促すこずです。長い入力がある堎合は、未保存の入力を保持しお再適甚できるようにするず再入力の手間を枛らせたす。

What should the API return on a conflict to help the UI recover?

競合時には明確な 409 応答䟋HTTP 409ずずもに、回埩に必芁な情報を返しおください珟圚のサヌバヌ偎のバヌゞョンたたは updated_at、最新のサヌバヌ倀、できれば誰がい぀倉曎したかずいった情報です。UI はそれを䜿っお差分を衚瀺したり、再詊行の刀断を助けたす。

What are the most common mistakes that still lead to data loss?

よくあるミスは、保存時にトヌクンを送らないフォヌムで隠しフィヌルドが挏れる、API が倉曎されたフィヌルドだけ送るなど、id のみで曎新しお id + version 条件を䜿っおいない、たたは䜎粟床なタむムスタンプ秒単䜍などを䜿っおいるこずです。さらにノヌトや配列をたるごず眮き換えるず、他人の線集を消しおしたう危険がありたす。

How do I implement this in AppMaster without custom coding?

AppMaster では、Data Designer に version フィヌルドを远加し、UI がフォヌム状態にそれを読み蟌むようにしたす。Business Process で条件付き曎新期埅されるバヌゞョンが䞀臎する堎合のみ曎新を実装し、競合が起きたら UI で再読み蟌みレビュヌのフロヌに分岐させれば、カスタムコヌドなしで実珟できたす。

始めやすい
䜕かを䜜成する 玠晎らしい

無料プランで AppMaster を詊しおみおください。
準備が敎ったら、適切なサブスクリプションを遞択できたす。

始める
管理ツヌルの楜芳的ロックサむレント䞊曞きを防ぐ | AppMaster