私はRESTfulWebAPIを設計しようとしているので、rfc2616を研究してきました。私は楽観的同時実行性のためにETagを使用するというアイデアが好きで、競合状態なしでリソースを追加する安全な方法を作るためにそれを使用しようとしていました。しかし、セクション14.24で次の2つのステートメントに気づきました。
リクエストがIf-Matchヘッダーフィールドなしで2xxまたは412ステータス以外の結果になる場合は、If-Matchヘッダーを無視する必要があります。
リソース(PUTなど)を更新することを目的としたリクエストには、If-Match値に対応するエンティティ(単一のエンティティタグ)がなくなった場合にリクエストメソッドを適用してはならないことを通知するIf-Matchヘッダーフィールドを含めることができます(MAY)。そのリソースの表現。
私はRDBMSを使用していますが、トランザクションを試すまでトランザクションが正常にコミットされるかどうかわからないため、最初の要件は少し面倒だと思います。誰かがETagが一致しないヘッダーを提供した場合を考えてみましょIf-Match
う。コミットが成功した場合は、ヘッダーに注意しIf-Match
、コミットを試みずに412を返す必要があります。コミットが失敗した場合、If-Match
ヘッダーのないリクエストは結果として発生します。非2XX/412応答なので、If-Match
ヘッダーを無視する必要があります。つまり、コミットを試行する必要があります。
私が理解できる限り、私には2つの選択肢があります。
- 2フェーズコミットを使用して、コミットを試行する前にコミットが成功するかどうかを予測します。
- 上記の最初の要件を無視し、無視
If-Match
すると2XX/412以外の応答が発生した場合でも412を返します。(これは私が傾いているものです)
他のアイデアはありますか?仕様を誤解していますか?