feat: add notification production capability
This commit is contained in:
@@ -17,6 +17,19 @@ readOnly 를 바꿔 쓰면 같은 빈을 공유하는 동시 요청 사이에 ra
|
||||
사라지고, 각 모드를 따로 감사(audit)할 수 있다. 세 템플릿 모두 isolation 을 `READ_COMMITTED`
|
||||
로 고정한다(모드표는 CLAUDE.md §TransactionPort implementation contract).
|
||||
|
||||
### 왜 `inRootWrite`가 별도 템플릿이나 `NEVER` propagation을 만들지 않나
|
||||
`inRootWrite`의 실행 속성은 `inWrite`와 같은 `WRITE + REQUIRED + READ_COMMITTED`라 기존
|
||||
write template을 재사용한다. 차이는 실행 전 precondition이다.
|
||||
`TransactionSynchronizationManager.isActualTransactionActive()`가 `true`이면 action과
|
||||
`PlatformTransactionManager`를 호출하기 전에
|
||||
`NestedRootTransactionRejectedException`으로 fail-fast한다. `REQUIRES_NEW`로 suspend해서
|
||||
"root처럼 보이게" 하지 않으므로 호출자 transaction과 독립 commit되는 silent 의미 변경이 없다.
|
||||
|
||||
`TransactionTemplate.execute`는 commit까지 성공한 다음 값을 반환한다. 따라서
|
||||
`inRootWrite`의 결과는 post-commit에만 호출자에게 보이고, commit 실패는 값 대신 원래 transaction
|
||||
예외로 전파된다. 이 보장은 action이 외부 객체를 직접 변경하는 것을 되돌리는 보상이 아니라,
|
||||
경계의 반환값을 성공으로 노출하지 않는 계약이다.
|
||||
|
||||
## audit — `AuditableEntity` / `AuditContextPort` / `DomainContextAuditContextPort`
|
||||
|
||||
### 캡처 메커니즘 — Manual explicit-set (D1 현재 스켈레톤 기본값)
|
||||
|
||||
Reference in New Issue
Block a user