409 Conflict

リクエストが現在の状態と競合しています。

使いどころ

一意であるべき値の重複、または古いバージョンに基づく編集。

よくある原因と対処法

409 は、リクエスト自体は正しいものの、現在の状態と衝突していることを意味します。典型的なケースは、一意制約に違反する重複したユーザー名やメールアドレスの挿入、既に存在するものの作成、読み込んだ後に他の誰かが変更したレコードの保存(バージョン列で検出)です。データベースの一意制約違反(Postgres の 23505、MySQL の 1062)は、500 として表に出すのではなく 409 に対応付けてください。

ボディでは何が競合したのかを説明し、できれば現在のバージョンを含めて、クライアントがマージしたりユーザーに確認したりできるようにしましょう。競合が別のトランザクションが保持するロックのような一時的なものでない限り、そのまま再試行しても再び失敗します。Kubernetes は古い resourceVersion を含む更新に 409 を返します。対処法はおなじみのループで、読み直し、変更を適用し直し、再送します。

クライアントエラー (4xx)

4xx はクライアントエラーです。リクエスト自体が誤っている、認証されていない、または存在しないものを指しています。同じリクエストを再試行しても解決しません。

レスポンスでの表示

HTTP/1.1 409 Conflict

返し方

Node.js / Expressres.status(409).end()
Python / Flaskreturn '', 409
nginxreturn 409;

確認方法

curl -s -o /dev/null -w "%{http_code}\n" https://example.com/

HTTP ステータスコードを開く