복붙노트

[SPRING] POST 응답을 전달할 수없는 경우 트랜잭션을 롤백하는 방법

SPRING

POST 응답을 전달할 수없는 경우 트랜잭션을 롤백하는 방법

Spring MVC를 사용하여 POST 요청을 처리하고 트랜잭션 내에서 데이터베이스 작업을 수행 한 다음 응답 본문에 결과를 반환하는 컨트롤러를 구현했다고 가정합니다.

다음은 컨트롤러 및 서비스 레이어입니다.

@RestController
@RequiredArgsConstructor
public class SomeController {

  private final SomeService someService;

  @PostMapping("/something")
  public SomeResult postSomething(Something something) {
    return someService.handle(something);
  }

}

@Service
@RequiredArgsConstructor
public class SomeService {

  private final SomeRepository someRepository;

  @Transactional
  public SomeResult handle(Something something){
    // changes to the database
  }

}

질문 :

서비스 호출 직후에 누군가가 네트워크 케이블을 당겨서 거래가 완료되었다고 가정합니다.

1) 응답을 전달할 수없는 경우 Spring에서 예외가 발생합니까?

2) 응답을 전달할 수없는 경우 트랜잭션을 롤백 할 수 있습니까?

3) 클라이언트가 재 시도 할 때 데이터베이스가 일관되게 유지되는지 어떻게 확인할 수 있습니까? (POST는 멱등수가 아닙니다.)

감사!

해결법

  1. ==============================

    1.나는 당신에게 질문에 대답하려고 노력할 것이다.

    나는 당신에게 질문에 대답하려고 노력할 것이다.

    1) 어쩌면. 응답의 크기와 연결이 끊어지는 정확한 순간에 따라 다릅니다.

    Spring이 소켓 OS에 응답을 쓰려고 시도 할 때 TCP / IP 연결이 닫혔다는 것을 감지하면 예외가 발생합니다. TCP 프로토콜에는 이러한 상황을 탐지하는 내부 절차가 없으므로 OS는 시간 초과와 같은 경험적 방법을 사용합니다.

    그래서 여기에 하나의 옵션 만 있습니다. Spring은 소켓에 대한 응답을 작성하려고하지만 응답이 너무 커서 버퍼에 맞출 수 없습니다. 이 상황에서는 쓰기 작업이 차단됩니다. 그런 다음 시간이 지나면 제한 시간으로 인해 인터럽트되고 예외가 발생합니다.

    100 % 내 대답이 정확하지 않으므로 직접 확인하는 것이 좋습니다. 버퍼 크기, 타임 아웃, 스프링 구현과 같은 많은 다른 요소에 의존하기 때문에이 메커니즘에 의존하지 말 것을 제안합니다.

    2) 봄 답은 아니오가됩니다.

    3) 그것은 당신에게 달렸습니다. 보편적 인 대답은 없습니다. 예를 들어 Hibernate는 당신의 객체에서 버전 관리를 사용하도록 구성 될 수 있습니다.

  2. from https://stackoverflow.com/questions/44908138/how-to-rollback-a-transaction-if-the-post-response-could-not-be-delivered by cc-by-sa and MIT license