transaction4 Kafka 트랜잭션과 Spring 트랜잭션 시점 차이로 인한 데이터 일관성 문제 들어가며카프카를 사용하면서 카프카 트랜잭션과 스프링 트랜잭션의 시점 차이로 인한 데이터 일관성 문제에 대해 해결한 글을 작성할 예정이다. 이는 결론적으로 트랜잭션과 카프카 이벤트 발행 사이에서 발생하는 정합성 문제이다. 문제 상황발생한 문제의 상황은 트랜잭션 내에서 데이터 변경 후 이벤트를 발행하는 경우, 다른 서비스에서 트랜잭션 커밋 이전의 데이터를 사용할 때이다. 이때 예외가 발생해버리는 것이다. 문제 원인 및 해결트랜잭션이 커밋되기 이전에 카프카 이벤트를 발행하면, 트랜잭션의 실패 여부와 상관없이 이벤트는 발행되도록 구현했던 것이 문제의 원인이었다. 이를 해결하기 위해 TransactionalEventListener를 활용했다. 현재 spring transaction이 후에 kafka 이벤트가 .. Tech/Kafka 2024. 5. 23. 예외와 트랜잭션 커밋/롤백 예외가 발생했는데, 내부에서 예외를 처리 못 하고 트랜잭션 범위 밖으로 예외를 던지면 어떻게 될까? 예외 발생 시 스프링 트랜잭션 AOP는 예외 종류에 따라 트랜잭션을 커밋하거나 롤백한다. 언체크 예외인 RuntimeException, Error와 그 하위 예외가 발생하면 트랜잭션을 롤백한다. 체크 예외인 Exception과 그 하위 예외가 발생하면 트랜잭션을 커밋한다. 물론 정상 응답(리턴)하면 트랜잭션을 커밋한다. 테스트 코드 @SpringBootTest public class RollbackTest { @Autowired RollbackService rollbackService; @Test void runtimeException() { assertThatThrownBy(() -> rollbackSe.. Tech/Spring 2024. 1. 3. SpringBootTest : 데이터베이스 분리 로컬에서 사용하는 애플리케이션 서버와 테스트에서 같은 데이터베이스를 사용하고 있으니 테스트에서 문제가 발생함 테스트를 다른 환경과 철저하게 분히해야 함 테스트 전용 데이터베이스를 별도로 운영하는 것임 현재 JdbcTemplate를 사용해서 findItems를 구현한 상태이다. (추후 업로드 예정) findItems: 전체 아이템 조회 쿼리 이후에 다른 테스트와 함께 실행하면 이렇게 에러가 발생한다. 처음 테스트를 실행할 때 저장한 데이터가 계속 남아있기 때문에 두번째 테스트에 영향을 준 것임 save()에서도 동일한 문제가 발생할 것이다. 이 문제를 해결하려면 각 테스트가 끝날 때마다 해당 테스트에서 추가한 데이터를 삭제해야 한다. 💡 테스트는 다른 테스트와 격리해야 한다. 💡 테스트는 반복해서 실행할 .. Tech/Spring 2023. 12. 11. DB 트랜잭션 실습: 계좌이체 set autocommit false; update member set money=10000 - 2000 where member_id = 'memberA'; update member set money=10000 + 2000 where member_id = 'memberB'; 문제 발생 계좌 이체 실패 상황 memberB는 12000원이 되어야 함 커밋 후 롤백 위와 동일한 문제 발생 롤백을 통해 계좌이체 실행 전으로 복구됨 정리 원자성: 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하거나 모두 실패해야 한다. 성공하면 한번에 반영, 중간에 실패해도 마치 하나의 작업을 되돌리는 것처럼 간단히 되돌릴 수 있다. 오토 커밋: 쿼리를 하나 실행할 때마다 바로바로 커밋되어 버리기 때문에 계.. CS/DB 2023. 11. 16. 이전 1 다음 728x90 반응형