Database

    [Database] 트랜잭션 격리 수준

    [Database] 트랜잭션 격리 수준

    트랜잭션 격리 수준 동시에 트랜잭션이 처리될 때, 트랜잭션끼리 얼마나 서로 고립되어 있는지를 나타낸 것이다. → 즉, 특정 트랜잭션이 다른 트랜잭션에서 변경한 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것이다. level이 아래로 내려갈수록 트랜잭션간 고립 정도가 높아지며, 성능이 떨어지는 것이 일반적이다. 동시성 문제 Dirty Read 트랜잭션1에서 A테이블을 SELECT 한 후 트랜잭션2에서 A테이블 내용을 변경하는 상황. 트랜잭션2가 해당 변경사항을 commit 하지도 않았는데, 트랜잭션1에서 다시 A테이블을 SELECT하면 해당 변경사항을 읽어들일 수 있음. Non-repeatable Read (Inconsistent Read) 트랜잭션1에서 A테이블을 SELECT 한 후 트랜잭션2에서 A..

    PK: UUID vs Auto Increment

    UUID UUID는 범용 고유 식별자이다. 물론 무조건 유일을 보장하지는 않지만, UUID는 범위가 10의 38승이기 때문에 실질적으로 거의 유일하다고 볼 수 있다. 장점 분산 시스템에서 적절하다. (auto increment에서 설명) DB 환경에 독립적이다. (어떤 DB를 사용하든 uuid 생성 함수를 사용하면 된다) 단점 성능에 저하를 일으킨다 → 검색의 효율을 위해 id를 정렬한다면? UUID는 엄청 큰 문자열이기 때문에 정렬하는 비용이 생각보다 많이 든다. 사람이 보기 힘들다. Auto Increment 1부터 시작해서 데이터가 추가될 때마다 자동으로 숫자를 늘려가는 방식이다. +) 물론 타입을 조심해야 한다. 데이터가 21억 건이 넘어가면? → Integer로는 부족하다. 장점 빠르다. 눈에 ..

    [Spring] MariaDB connection 끊김

    가벼운 API는 상관이 없는데, 호출 한 번에 10분 넘게 소요되는 무거운 API의 경우 중간에 커넥션이 끊기는 현상이 발생했다. 검색을 해보니, DB의 wait_timeout(현재 3분)보다 커넥션이 지속되는 경우 발생하는 문제로 추정된다. 종료된 커넥션을 다시 사용하기 전에 해당 커넥션이 정상적인지 검사를 하는 작업이 필요했고, validation query 설정을 사용하기로 결정했다. 스프링 서버에 해당 설정을 추가한다. spring: datasource: tomcat: validation-query: "select 1" 설정 이후 장시간 소요되는 API에서도 커넥션 끊김 현상이 사라졌다. 참고자료 https://xzio.tistory.com/10 https://engineering-skcc.git..

    [Spring] Failed to validate connection

    서비스 운영 중 아래와 같은 경고 로그가 지속적으로 생겼다. hikariPool - Failed to validate connection org.mariadb.jdbc.MariaDbConnection@7aa2f8a6 ((conn=463456) Connection.setNetworkTimeout cannot be called on a closed connection). Possibly consider using a shorter maxLifetime value. 서비스가 동작하는데 특별한 문제는 없었지만, 자꾸 경고 로그가 발생하는 것이 거슬려서 해결해보기로 한다. 경고 로그 마지막에 using a shorter maxLifetime value 라는 것이 보여서 해당 키워드로 열심히 검색해봤다. 알아본 결..

    [AWS] RDS "Too many connections"

    [AWS] RDS "Too many connections"

    RDS 운영 중 다음과 같은 메시지가 발생하면서 RDS가 먹통이 될 때가 있다. "Too many connections" 프로젝트 배포시에 해당 오류가 발생하거나 RDS를 이용하지 못하게 되는 경우 해결 방법을 알아보자. 결론적으로 말하면 max_connections와 wait_timeout 값을 조정하면 된다. 해당 값들은 AWS Console에서 변경 가능하다. max_connections: 클라이언트가 동시에 접속할 수 있는 커넥션 수 wait_timeout: 사용하지 않는 커넥션이 닫히는 데까지 서버가 대기하는 시간 AWS Console -> RDS -> 파라미터 그룹 으로 이동하자. 파라미터 그룹은 max_connections와 같은 DB 관리에 필요한 파라미터들을 모아놓은 그룹이다. 처음엔 d..