重要なドキュメントでチームメイトと共同作業をしています。重要な編集をするためにドキュメントを開き、保存しようとしたまさにその時、「このドキュメントは現在、他のユーザーによってロックされています。後でもう一度お試しください。」というメッセージが表示されます。しかし、イライラする代わりに、賢いシステムが競合を防いでくれたおかげで、同僚の作業を上書きするのを避けることができたことに安堵感を覚えます。
この共同作業のセーフティネットは、HTTPのより専門的なステータスコードの一つである423 Locked
によって支えられています。このコードは、従来の意味でのセキュリティや権限に関するものではなく、共同作業環境における競合の防止を目的としています。
423
ステータスコードは、サーバーが「他の誰かがすでにこのリソースで作業しているため、今は変更できません。順番をお待ちください。」と伝える方法です。これは、ホテルの部屋のドアにある「起こさないでください」のサインや、共有Googleドキュメントで他の誰かのカーソルが活発にタイピングしているのを見るのとデジタル的に同じです。
しかし、ご心配なく。この記事の終わりには、その意味を理解するだけでなく、なぜそれが起こるのか、どうすれば修正できるのか、そして将来どうすればそれを避けられるのかもわかるでしょう。
API開発者またはテスターの方には、Apidogのようなツールが423エラーの検出と解決をいかに簡単にするかをお見せします。
共同編集ツール、バージョン管理システム、または複数のユーザーが互いに競合する可能性のあるアプリケーションを扱っている場合、423
を理解することは非常に価値があります。
それでは、リソースロックの世界とHTTP 423ステータスコードについて探っていきましょう。
問題:同時編集の危険性
423
が存在する理由を理解するには、同時変更の問題を理解する必要があります。アリスとボブという2人のユーザーが、同じ顧客レコードを同時に編集していると想像してください。
- 午後3時00分00秒: アリスとボブは両方とも顧客レコードを取得します。表示されているのは:
{"name": "John", "email": "john@old.com"}
- 午後3時00分01秒: アリスはメールアドレスを
john@new.com
に変更して保存します。 - 午後3時00分02秒: ボブは名前を「Jonathan」に変更して保存します。
- 結果: ボブの保存は、彼が古いバージョンで作業していたため、アリスのメールアドレスの変更を上書きしてしまいます。最終的なレコードは
{"name": "Jonathan", "email": "john@old.com"}
と表示され、アリスの作業は失われます!
これは「失われた更新」問題と呼ばれ、共同作業システムにおける古典的な問題です。423 Locked
ステータスコードはその解決策の一部です。
HTTP 423 Locked は実際に何を意味するのか?
423 Locked
ステータスコードは、HTTPへのWebDAV(Web Distributed Authoring and Versioning)プロトコル拡張の一部です。これは、リソースがロックされているため、メソッド(PUT、DELETE、PROPPATCHなど)がそのリソースに対して実行できなかったことを示します。
レスポンスには、通常XMLを使用して、ロックに関する情報がレスポンスボディに含まれるべきです。
典型的な423
レスポンスは次のようになります。
HTTP/1.1 423 LockedContent-Type: application/xml; charset="utf-8"
<?xml version="1.0" encoding="utf-8"?>
<D:error xmlns:D="DAV:">
<D:lock-token-submitted>
<D:href>/workspace/doc.txt</D:href>
</D:lock-token-submitted>
</D:error>
または、より役立つバージョンは次のようになります。
HTTP/1.1 423 LockedContent-Type: application/json
{
"error": "ResourceLocked",
"message": "This document is currently being edited by alice@example.com",
"locked_until": "2024-01-15T14:30:00Z",
"locked_by": "alice@example.com"
}
このコードは、リモートサーバー上のファイルを共同で編集および管理することを可能にするHTTPの拡張プロトコルであるWebDAV(Web Distributed Authoring and Versioning)に由来します。
より簡単に言えば:
423 Lockedエラーは、リソース(ファイル、オブジェクト、レコードなど)が現在他の誰かまたは何かに「ロック」されており、あなたのリクエストがそれを変更しようとしたときに発生します。
公式定義(RFC 4918)
RFC 4918(WebDAVを定義している)によると:
「423(Locked)ステータスコードは、メソッドのソースまたはターゲットリソースがロックされていることを意味します。」
これは次のことを意味します:
- サーバーはあなたのリクエストを理解しています。
- リクエストの構文は有効です。
- しかし、ターゲットとなるリソースがロックされているため、操作を実行できません。
要するに:今は変更できません。
423 Locked が表示される一般的なシナリオ
Web開発とAPI設計の両方でこのステータスコードが現れる、いくつかの実世界の例を見ていきましょう。
1. ファイルの同時編集
Webアプリケーションがファイルのアップロード、更新、または共同編集を許可している場合、競合を防ぐためにロックメカニズムを使用することがあります。
ファイルがロックされている場合(他のユーザーが同時に編集するのを防ぐため)、それを上書きしようとすると423がトリガーされます。
例:
- ドキュメント管理システムは、ファイルが編集されている間、ファイルをロックします。
- 別のユーザーが変更をアップロードしようとする → HTTP 423 Locked。
2. データベースレコードのロック
機密データ(在庫、銀行、スケジュールなど)を扱うAPIでは、競合状態を防ぐために更新中にレコードがロックされることがよくあります。
あるトランザクションが変更のためにレコードをロックし、別のリクエストがそれを更新しようとすると、後者のリクエストは423 Lockedを受け取る可能性があります。
3. バージョン管理システム
Gitベースのプラットフォームやファイルバージョン管理をサポートするCMSソフトウェアのようなシステムでは、マージまたは承認プロセスが完了するまでファイルやエンティティがロックされることがあります。
その期間中にプッシュまたは削除しようとすると、423レスポンスがトリガーされる可能性があります。
4. APIレート制限またはワークフローロック
一部のAPIは、ワークフローの順序を維持するために一時的なロックを実装しています。
例えば、リソースが処理中または検証中である間はロックされ、それが完了するまで新しい変更はブロックされます。
5. WebDAVファイル操作
423はWebDAVに由来するため、ロックされたリソースに対するCOPY
、MOVE
、DELETE
、PUT
などの操作は、このステータスを返します。
ロックメカニズム:実際の動作
リソースロックは通常、WebDAV準拠のシステムで特定のワークフローに従います。
ステップ1:ロックの取得
編集する前に、クライアントはLOCK
メソッドを使用してリソースのロックを要求します。
LOCK /documents/report.txt HTTP/1.1
Host: example.comTimeout: Second-3600Content-Type: application/xmlContent-Length: 150
<?xml version="1.0" encoding="utf-8"?>
<D:lockinfo xmlns:D="DAV:"><D:lockscope><D:exclusive/></D:lockscope><D:locktype><D:write/></D:locktype><D:owner>Alice</D:owner></D:lockinfo>
ステップ2:サーバーがロックを許可
サーバーは成功を返し、ロックトークンを提供します。
HTTP/1.1 200 OKContent-Type: application/xmlLock-Token: <urn:uuid:e71d4fae-5dec-22d6-fea5-00a0c91e6be4>
<?xml version="1.0" encoding="utf-8"?>
<D:prop xmlns:D="DAV:"><D:lockdiscovery><D:activelock><D:locktype><D:write/></D:locktype><D:lockscope><D:exclusive/></D:lockscope><D:depth>0</D:depth><D:owner>Alice</D:owner><D:timeout>Second-3600</D:timeout><D:locktoken><D:href>urn:uuid:e71d4fae-5dec-22d6-fea5-00a0c91e6be4</D:href></D:locktoken></D:activelock></D:prop>
ステップ3:ボブが編集を試みる
アリスがロックを保持している間に、ボブは同じドキュメントを変更しようとします。
PUT /documents/report.txt HTTP/1.1Host: example.comContent-Type: text/plain
This is Bob's attempted change.
ステップ4:サーバーが423 Lockedを返す
サーバーはチェックし、アリスがリソースに対して排他的ロックを保持していることを確認します。
HTTP/1.1 423 LockedContent-Type: application/xml
<?xml version="1.0" encoding="utf-8"?>
<D:error xmlns:D="DAV:"><D:lock-token-submitted><D:href>/documents/report.txt</D:href></D:lock-token-submitted></D:error>
ステップ5:アリスがロックを解除
アリスは編集が完了すると、明示的にリソースのロックを解除します。
UNLOCK /documents/report.txt HTTP/1.1
Host: example.comLock-Token: <urn:uuid:e71d4fae-5dec-22d6-fea5-00a0c91e6be4>
WebDAVにおけるロックの種類
WebDAVは異なるロック戦略をサポートしています。
排他的ロック
一度に1人のユーザーのみが排他的ロックを保持できます。これは最も一般的なタイプであり、最も強力な競合防止策を提供します。
共有ロック
複数のユーザーが同時に共有ロックを保持できますが、共有ロックが存在する間は誰も排他的ロックを取得できません。これは、変更を防ぎながら読み取りを行うのに役立ちます。
423と409 Conflict:違いを理解する
これは同時アクセスの世界において重要な区別です。
423 Locked
: 「誰かが明示的にリソースをロックしているため、これは実行できません。」これは、事前に行われる予防策です。システムは、競合が発生する前に積極的にそれを防いでいます。409 Conflict
: 「変更を試みましたが、他の誰かの変更と競合しています。」これは事後対応です。競合はすでに発生しており、サーバーはあなたにそれを解決するよう伝えています。
例え:
423
: 会議室に入ろうとしますが、「会議中 - 邪魔しないでください」というサインがあります。あなたは外で待ちます。409
: あなたと同僚が同時にスケジューリングシステムで同じ会議室を予約しようとします。システムは、解決が必要な競合があることを伝えます。
WebDAVを超えた現代のアプリケーション
423
はWebDAVに由来しますが、リソースロックの概念は現代のアプリケーションで広く使用されています。
1. 共同ドキュメントエディタ
Google Docs、Notion、Confluenceなどのツールは、他の誰かがドキュメントを活発に編集しているときにそれを示すために、同様のロックメカニズムを使用しています。
2. データベースとレコードのロック
多くのアプリケーションは、同じレコードへの同時更新を防ぐために、データベースレベルで悲観的ロックを実装しています。
3. Eコマース在庫システム
商品をカートに追加すると、購入を完了するまでの間、システムはその在庫を一時的に「ロック」して、売り越しを防ぐことがあります。
4. ファイルのアップロードと処理
システムは、ファイルが処理中(例:ウイルススキャン、画像最適化)である間、他の操作が干渉するのを防ぐためにファイルをロックすることがあります。
RESTful APIにおける423 Locked:使用すべきか?
もちろんですが、注意が必要です。
REST API設計において、423を使用することは次の場合に有益です。
- リソースが中断されるべきではないプロセスを実行中である。
- ファイルまたはオブジェクトが他のユーザーによって変更されている。
- 一時的なビジネスロジックが「ロック」動作を必要とする。
ただし、より広範な用途(WebDAVのコンテキスト外)向けにAPIを設計している場合は、423がより特定的であるため、一般的な状態の競合には代わりに409 Conflictを返すことを検討してもよいでしょう。
Apidogを使ったAPIテスト

同時アクセスシナリオのテストは困難ですが、非常に重要です。Apidogは、これらの複雑なワークフローをテストするための優れた機能を提供します。
Apidogを使用すると、次のことができます。
- 複数のユーザーをシミュレート: 異なる認証トークンを持つ異なるリクエストを作成し、アリスとボブが同じリソースで作業している状況をシミュレートします。
- ロック取得のテスト:
LOCK
リクエスト(WebDAVサーバーをテストしている場合)またはカスタムのロックエンドポイントを送信し、ロックトークンを含む正しいレスポンスが得られることを確認します。 - ロック強制のテスト: 「アリス」にロックを取得させ、その後「ボブ」がリソースを変更しようとし、彼が
423 Locked
レスポンスを受け取ることを確認します。 - ロック解除のテスト: 「アリス」がロックを解除した後、「ボブ」がリソースを正常に変更できることを確認します。
- ロックシナリオの自動化: 完全なロックワークフローを自動的に実行するテストシナリオを作成し、ロックロジックが正しく機能することを確認します。
これは、機密データを扱うアプリケーションや、強力な一貫性保証を必要とするアプリケーションにとって特に価値があります。
ロック実装のベストプラクティス
サーバー開発者向け:
- 適切なタイムアウトを設定する: クライアントがクラッシュしたり切断されたりした場合にリソースが永久にロックされるのを防ぐため、常にロックの有効期限を設定してください。
- 明確なエラー情報を提供する:
423
を返す際には、誰がロックを保持しているか、いつ期限切れになるかなどの詳細を含めてください。 - ロック検出をサポートする: クライアントがロックを取得しようとせずに、誰がロックを保持しているか、そのステータスを確認できるようにします。
- 楽観的ロックを検討する: 一部のユースケースでは、楽観的ロック(バージョン番号やETagを使用)が悲観的ロックよりも効率的である場合があります。
クライアント開発者向け:
- 423を適切に処理する: 致命的なエラーとして扱わないでください。リソースがロックされていることをユーザーに通知し、後で再試行するオプションを提供します。
- ロックのタイムアウトを尊重する: ロックを回避しようとせず、自然に期限切れになるか、所有者がロックを解除するのを待ちます。
- ロックを速やかに解除する: 他のユーザーを不必要にブロックしないように、作業が完了したら常にロックを解除してください。
HTTP 423に関する一般的な誤解
いくつかの誤解を解き明かしましょう。
❌ 「これは権限エラーだ。」
いいえ、それは403 Forbiddenです。423は一時的でリソースに特化したものです。
❌ 「私のサーバーがダウンしているということだ。」
いいえ。サーバーは正常です。単にリソースを同時編集から保護しているだけです。
❌ 「WebDAVにのみ適用される。」
WebDAVで定義されていますが、現代のREST APIも文脈に合致する場合は423を使用します。
潜在的な落とし穴と考慮事項
ロックは強力ですが、いくつかの課題があります。
- デッドロック: 2つのプロセスがそれぞれリソースをロックし、その後、もう一方が持っているものをロックしようとすると、デッドロックが発生する可能性があります。
- パフォーマンスオーバーヘッド: ロックの管理は複雑さを増し、パフォーマンスに影響を与える可能性があります。
- ユーザーエクスペリエンス: 不適切に実装されたロックは、ユーザーが長期間ブロックされると不満を引き起こす可能性があります。
- 古いロック: クライアントがロックを解除せずにクラッシュした場合、リソースはタイムアウトが期限切れになるまでロックされたままになる可能性があります。
結論:共同作業のセーフティネット
HTTP 423 Locked
ステータスコードは、同時アクセスという複雑な問題に対する洗練された解決策を表しています。WebDAVプロトコルに由来しますが、リソースロックの概念は、信頼性の高い共同作業アプリケーションを構築するための基本です。
ロックをいつどのように使用するか、そして楽観的並行性制御のような代替戦略をいつ使用するかを理解することは、マルチユーザーシステムを構築する開発者にとって重要なスキルです。423
コードは恐れるべきエラーではなく、安全な共同作業を可能にする機能です。
適切なロックメカニズムを実装し、423
レスポンスを適切に処理することで、データ破損を防ぎ、スムーズな共同作業エクスペリエンスを提供するアプリケーションを構築できます。そして、これらの複雑な同時シナリオをテストする必要がある場合、Apidogのような強力なツールは、実際の条件下でロックロジックが完璧に機能することを保証するための制御と可視性を提供します。