봄 트랜잭션 필수 대 REQUESTERS_NEW : 롤백 트랜잭션
나는 다음과 같은 방법을 가지고 있습니다.propagation = Propagation.REQUIRES_NEW
트랜잭션 속성:
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void createUser(final UserBean userBean) {
//Some logic here that requires modification in DB
}
이 메서드는 모든 트랜잭션에 대해 동시에 여러 번 호출할 수 있으며, 오류가 발생할 경우 롤백되지 않습니다(다른 트랜잭션과는 별도로).
문제는 이로 인해 Spring이 다른 트랜잭션을 사용할 수 있더라도 여러 개의 트랜잭션을 생성하게 되고 일부 성능 문제가 발생할 수 있다는 것입니다.
자바 문서propagation = Propagation.REQUIRED
다음과 같이 말합니다.Support a current transaction, create a new one if none exists.
이것으로 성능 문제가 해결되는 것 같지 않습니까?
롤백 문제는 어떻습니까?기존 트랜잭션을 사용하는 동안 새로운 메서드 호출이 롤백되면 어떻게 됩니까? 그러면 이전의 호출도 전체 트랜잭션을 롤백하지 않습니까?
[편집] 제 질문이 충분히 명확하지 않았던 것 같습니다.
수백 개의 클라이언트가 서버에 연결되어 있습니다.
각 클라이언트에 대해 트랜잭션에 대한 피드백을 보낼 필요가 있습니다(확인 또는 예외 -> 롤백).
제 질문은 다음과 같습니다.REQUIRED
하나의 트랜잭션만 사용되며, 100번째 클라이언트에서 문제가 발생하면 첫 번째 클라이언트의 트랜잭션도 롤백됩니까?
사용.REQUIRES_NEW
메소드가 트랜잭션 컨텍스트에서 호출될 때만 관련이 있습니다. 메소드가 비전통적 컨텍스트에서 호출될 때와 동일하게 동작합니다.REQUIRED
새 트랜잭션이 생성됩니다.
그렇다고 해서 모든 클라이언트에 대해 단일 트랜잭션만 있는 것은 아닙니다. 각 클라이언트는 트랜잭션이 아닌 컨텍스트에서 시작하고 요청 처리가 완료되는 즉시@Transactional
새 트랜잭션이 생성됩니다.
그래서, 그것을 염두에 두고, 만약 사용한다면.REQUIRES_NEW
성능에 대해 걱정하지 않는 것보다 해당 작업의 의미에 대해 이해할 수 있습니다. 이것은 조기 최적화를 교과서적으로 보여주는 것입니다. 저는 성능 메트릭이 수집된 후에는 정확성과 데이터 무결성을 강조하고 성능에 대해 걱정하고 싶습니다.
롤백 시 - 사용REQUIRES_NEW
그러면 새 트랜잭션이 강제로 시작되므로 예외가 해당 트랜잭션을 롤백합니다.실행 중인 다른 트랜잭션도 있는 경우(예외가 스택에 거품을 일으키는지 탐지되었는지에 따라 롤백되지 않는지 여부) 작업의 세부 사항에 따라 선택할 수 있습니다.또한 트랜잭션 전략 및 롤백에 대한 보다 심층적인 논의를 위해 다음을 추천합니다. »트랜잭션 전략: 거래의 함정에 대한 이해», Mark Richards.
별도의 트랜잭션에서 수행해야 하는 경우 사용해야 합니다.REQUIRES_NEW
성능 오버헤드를 감수해야 합니다.고정 잠금 장치를 주의하십시오.
반대로 하는 게 낫겠어요.
- Java 측에서 데이터를 확인합니다.
- 모든 작업을 한 번의 트랜잭션으로 실행합니다.
- DB측에서 잘못된 부분이 있다면 -> DB 또는 Validation design의 큰 오류입니다.모든 항목을 롤백하고 심각한 최상위 오류를 발생시킵니다.
- 좋은 단위 테스트를 작성합니다.
언급URL : https://stackoverflow.com/questions/13051204/spring-transaction-required-vs-requires-new-rollback-transaction
'programing' 카테고리의 다른 글
Android Studio - 인터넷이 연결되지 않은 Android Emulator WiFi (0) | 2023.08.29 |
---|---|
MySQL에서 대소문자를 구분하지 않는 REPLACE? (0) | 2023.08.29 |
"2" 인수를 사용하여 "DownloadFile"을 호출하는 중 예외 발생: "WebClient 요청 중에 예외가 발생했습니다." (0) | 2023.08.29 |
배열의 모든 구성원을 영숫자로 전환하는 가장 빠른 방법은 무엇입니까? (0) | 2023.08.29 |
셀에서 이름 대신 번호로 시트 참조 (0) | 2023.08.29 |