{ "version": "1.1", "id": "commit-evidence-phase-machine", "title": "커밋 요청 뒤의 결과 판정", "question": "커밋을 넘긴 뒤 어떤 관측이 어느 결과 변형으로 이어지는가?", "type": "flow", "direction": "TB", "audience": [ "백엔드 엔지니어" ], "summary": "COMMIT_REQUESTED 관측 뒤 provider commit 의 결과가 네 변형 중 하나로 갈라진다.", "alt": "커밋 요청에서 시작해 provider commit 을 거쳐 Committed, CommittedWithPostCommitFailure, DeterminateRollback, Indeterminate 네 결과로 갈라지는 흐름도", "long_description": "tracker 가 COMMIT_REQUESTED 를 관측한 뒤 provider commit 을 호출한다. 예외가 없으면 Committed 다. RuntimeException 이 오면 먼저 commitAcknowledged 를 보고, 이미 afterCommit 이 왔으면 CommittedWithPostCommitFailure 다. 그렇지 않으면 rolledBack 과 UnexpectedRollbackException 과 replay 후보 여부를 보고, 하나라도 성립하면 DeterminateRollback 이다. 어느 것도 성립하지 않으면 Indeterminate 로 남는다.", "source_context": { "document": "docs/clean-architecture-backend-template/final/document.md", "document_sha256": "74b4986fd8621f6fd61791232777dc0e6c8ef999cbc2343df050bd5921ea03ac", "anchor": { "kind": "heading", "value": "3.2 트랜잭션 — `application-core` 포트에서 PostgreSQL local timeout까지", "line": 352 } }, "composition": { "profile": "component-flow", "diagram_only": true, "reference_ids": [ "payment-event-flow" ], "rationale": "커밋 요청 하나가 관측 두 번을 거쳐 네 결과 중 하나로 흘러가는 방향 있는 경로다. 참여자 간 왕복이 아니라 한 방향 갈래이므로 sequence 가 아니라 component-flow 다.", "focus_node": "indeterminate" }, "groups": [], "nodes": [ { "id": "commit-requested", "label": "COMMIT_REQUESTED", "kind": "process", "role": "source", "evidence": [ { "start_line": 397, "end_line": 397 } ], "assumption": false }, { "id": "provider-commit", "label": "provider commit", "kind": "service", "role": "service", "evidence": [ { "start_line": 398, "end_line": 400 } ], "assumption": false }, { "id": "ack-check", "label": "commitAcknowledged", "kind": "process", "role": "service", "evidence": [ { "start_line": 401, "end_line": 401 } ], "assumption": false }, { "id": "rollback-check", "label": "rolledBack · replay 후보", "kind": "process", "role": "service", "evidence": [ { "start_line": 404, "end_line": 406 } ], "assumption": false }, { "id": "committed", "label": "Committed", "kind": "result", "role": "sink", "evidence": [ { "start_line": 388, "end_line": 388 }, { "start_line": 396, "end_line": 400 } ], "assumption": false }, { "id": "post-commit-failure", "label": "CommittedWithPostCommitFailure", "kind": "result", "role": "sink", "evidence": [ { "start_line": 402, "end_line": 402 } ], "assumption": false }, { "id": "determinate-rollback", "label": "DeterminateRollback", "kind": "result", "role": "sink", "evidence": [ { "start_line": 407, "end_line": 407 } ], "assumption": false }, { "id": "indeterminate", "label": "Indeterminate", "kind": "result", "role": "sink", "evidence": [ { "start_line": 391, "end_line": 391 }, { "start_line": 409, "end_line": 409 } ], "assumption": false, "emphasis": "primary" } ], "edges": [ { "id": "hand-over", "from": "commit-requested", "to": "provider-commit", "label": "commit(status)", "kind": "request", "evidence": [ { "start_line": 397, "end_line": 399 } ], "assumption": false }, { "id": "no-exception", "from": "provider-commit", "to": "committed", "label": "예외 없음", "kind": "response", "evidence": [ { "start_line": 388, "end_line": 388 }, { "start_line": 396, "end_line": 400 } ], "assumption": false }, { "id": "runtime-exception", "from": "provider-commit", "to": "ack-check", "label": "RuntimeException", "kind": "response", "evidence": [ { "start_line": 400, "end_line": 401 } ], "assumption": false }, { "id": "already-acked", "from": "ack-check", "to": "post-commit-failure", "label": "afterCommit 도착", "kind": "data", "evidence": [ { "start_line": 401, "end_line": 402 } ], "assumption": false }, { "id": "not-acked", "from": "ack-check", "to": "rollback-check", "label": "미도착", "kind": "data", "evidence": [ { "start_line": 403, "end_line": 404 } ], "assumption": false }, { "id": "rollback-confirmed", "from": "rollback-check", "to": "determinate-rollback", "label": "하나라도 성립", "kind": "data", "evidence": [ { "start_line": 404, "end_line": 407 } ], "assumption": false }, { "id": "no-signal", "from": "rollback-check", "to": "indeterminate", "label": "판정 근거 없음", "kind": "data", "evidence": [ { "start_line": 409, "end_line": 409 } ], "assumption": false, "emphasis": "primary" } ], "legend": [], "metadata": {} }