transaction
-
기존 서비스에 api 중에서 getOOO 수행 시, OOO가 없는 경우에는 insert를 하는 케이스가 존재하고 있다. 이 API의 로직을 확인해 보면 Mybatis를 이용해서 insert문에 아래와 같이 중복 처리를 해주었다.INSERT INTO TABLE_NAME VALUES () ON DUPLICATE KEY UPDATE 해당 부분을 포함하는 API를 JPA로 전환하는 과정에서 위의 SQL은 사용할 수 없다는 것을 알게 되었고우선 해당 부분은 고려하지 않고 전환을 하고 테스트를 진행해 보았다. 특정한 이유로 client 측에서 해당 api를 동시에 호출하게 되면중복 insert가 발생하게 되었다. ConstraintViolationExceptiono.h.engine.jdbc.spi.SqlExce..
비관적 락 데드락 발생 내역 (Pessimistic Lock and DeadLock)기존 서비스에 api 중에서 getOOO 수행 시, OOO가 없는 경우에는 insert를 하는 케이스가 존재하고 있다. 이 API의 로직을 확인해 보면 Mybatis를 이용해서 insert문에 아래와 같이 중복 처리를 해주었다.INSERT INTO TABLE_NAME VALUES () ON DUPLICATE KEY UPDATE 해당 부분을 포함하는 API를 JPA로 전환하는 과정에서 위의 SQL은 사용할 수 없다는 것을 알게 되었고우선 해당 부분은 고려하지 않고 전환을 하고 테스트를 진행해 보았다. 특정한 이유로 client 측에서 해당 api를 동시에 호출하게 되면중복 insert가 발생하게 되었다. ConstraintViolationExceptiono.h.engine.jdbc.spi.SqlExce..
2025.01.08 -
잠금과 트랜잭션은 서로 비슷한 개념 같지만 다르다.잠금동시성을 제어하기 위한 기능여러 커넥션에서 동시에 동일한 자원을 요청할 경우 순서대로 한 시점에는 하나의 커넥션만 변경할 수 있게 해주는 역할 트랜잭션데이터의 정합성을 보장하기 위한 기능 격리 수준은 하나의 트랜잭션 내에서 또는 여러 트랜잭션 간의 작업 내용을 어떻게 공유하고 차단할 것인지를 결정하는 레벨범위를 최소화해야 한다. 네트워크 작업이 있는 경우 반드시 트랜잭션에서 배제해야 한다. MySQL에서 사용되는 잠금은 크게 스토리지 엔진 레벨, MySQL 엔진 레벨로 나눌 수 있다. (https://kkang-joo.tistory.com/163)MySQL 엔진은 스토리지 엔진을 제외한 나머지 부분MySQL 엔진 레벨의 잠금은 스토리지 엔진에 영향을 ..
[MySQL] 5장 트랜잭션과 잠금잠금과 트랜잭션은 서로 비슷한 개념 같지만 다르다.잠금동시성을 제어하기 위한 기능여러 커넥션에서 동시에 동일한 자원을 요청할 경우 순서대로 한 시점에는 하나의 커넥션만 변경할 수 있게 해주는 역할 트랜잭션데이터의 정합성을 보장하기 위한 기능 격리 수준은 하나의 트랜잭션 내에서 또는 여러 트랜잭션 간의 작업 내용을 어떻게 공유하고 차단할 것인지를 결정하는 레벨범위를 최소화해야 한다. 네트워크 작업이 있는 경우 반드시 트랜잭션에서 배제해야 한다. MySQL에서 사용되는 잠금은 크게 스토리지 엔진 레벨, MySQL 엔진 레벨로 나눌 수 있다. (https://kkang-joo.tistory.com/163)MySQL 엔진은 스토리지 엔진을 제외한 나머지 부분MySQL 엔진 레벨의 잠금은 스토리지 엔진에 영향을 ..
2025.01.04 -
트랜잭션은 ACID를 보장해야 한다.Atomicity, Consistency, Isolation, Durability 이들 중에 이번에는 격리성에 대해서 알아보자 격리성동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다.예를 들어 동시에 같은 데이터를 수정하지 못하도록 해야 한다.격리성은 동시성과 관련된 성능 이슈로 인해 격리 수준을 선택할 수 있다. 격리 수준Read uncommitted : 커밋되지 않은 읽기Read Commited : 커밋된 읽기Repeatable Read : 반복 가능한 읽기Serializable : 직렬화 가능 Read Uncommited의 격리 수준이 가장 낮고 Serializable의 격리 수준이 가장 높다. 격리 수준에 따른 문제점Dirty ReadNon-..
[Transaction] 격리 수준(Isolation)트랜잭션은 ACID를 보장해야 한다.Atomicity, Consistency, Isolation, Durability 이들 중에 이번에는 격리성에 대해서 알아보자 격리성동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다.예를 들어 동시에 같은 데이터를 수정하지 못하도록 해야 한다.격리성은 동시성과 관련된 성능 이슈로 인해 격리 수준을 선택할 수 있다. 격리 수준Read uncommitted : 커밋되지 않은 읽기Read Commited : 커밋된 읽기Repeatable Read : 반복 가능한 읽기Serializable : 직렬화 가능 Read Uncommited의 격리 수준이 가장 낮고 Serializable의 격리 수준이 가장 높다. 격리 수준에 따른 문제점Dirty ReadNon-..
2024.12.03 -
spring-retry의 2.0.1 버전부터는 @EnableRetry 어노테이션에 order 설정이 추가되었다. @Retryable의 order 기본값은 Ordered.LOWEST_PRECEDENCE - 1 @Transational의 order 기본값은 Ordered.LOWEST_PRECEDENCE 그렇기 때문에 @Transational 보다 먼저 @Retryable이 적용될 수 있다. @Retryable { @Transactional { Your method body } End of @Transactional } End of @Retryable 위와 같은 순서로 적용되어서 만약 내부 로직에 DB Operation이 있다면 retry시에 기존 Transaction과는 다른 Transaction으로 적용이..
[Spring] @Retryable @Transational 적용 순서spring-retry의 2.0.1 버전부터는 @EnableRetry 어노테이션에 order 설정이 추가되었다. @Retryable의 order 기본값은 Ordered.LOWEST_PRECEDENCE - 1 @Transational의 order 기본값은 Ordered.LOWEST_PRECEDENCE 그렇기 때문에 @Transational 보다 먼저 @Retryable이 적용될 수 있다. @Retryable { @Transactional { Your method body } End of @Transactional } End of @Retryable 위와 같은 순서로 적용되어서 만약 내부 로직에 DB Operation이 있다면 retry시에 기존 Transaction과는 다른 Transaction으로 적용이..
2024.03.27