plantuml
@startuml
!theme plain
skinparam BoxPadding 20
skinparam ParticipantPadding 20
participant "Client A" as clientA
participant "Client B" as clientB
participant "API\nServer" as api
database "Database" as db
clientA -> api: GET /api/products/123
api -> db: SELECT * FROM products\nWHERE id = 123
db --> api: Product Data\nLast-Modified: 2025-09-15 10:00:00
api --> clientA: 200 OK\nLast-Modified: Wed, 15 Sep 2025 10:00:00 GMT\n{"price": 99.99}
clientB -> api: GET /api/products/123
api -> db: SELECT * FROM products\nWHERE id = 123
db --> api: Product Data\nLast-Modified: 2025-09-15 10:00:00
api --> clientB: 200 OK\nLast-Modified: Wed, 15 Sep 2025 10:00:00 GMT\n{"price": 99.99}
clientA -> api: PUT /api/products/123\nIf-Unmodified-Since: Wed, 15 Sep 2025 10:00:00 GMT\n{"price": 89.99}
api -> db: SELECT last_modified\nFROM products\nWHERE id = 123
db --> api: 2025-09-15 10:00:00
api -> api: Timestamp check:\nUNMODIFIED since cutoff
api -> db: UPDATE products\nSET price = 89.99,\nlast_modified = NOW()\nWHERE id = 123
db --> api: 1 row updated\nNew Last-Modified: 2025-10-01 11:00:00
api --> clientA: 200 OK\nLast-Modified: Tue, 01 Oct 2025 11:00:00 GMT
clientB -> api: PUT /api/products/123\nIf-Unmodified-Since: Wed, 15 Sep 2025 10:00:00 GMT\n{"price": 79.99}
api -> db: SELECT last_modified\nFROM products\nWHERE id = 123
db --> api: 2025-10-01 11:00:00\n(Modified by Client A)
api -> api: Timestamp check:\nMODIFIED after cutoff\n(2025-10-01 > 2025-09-15)
api --> clientB: 412 Precondition Failed\n{"error": "Resource modified"}
note over clientB: Client B muss\nRessource neu laden\nund Update wiederholen
@enduml