본문 바로가기
Spring|Spring-boot

스프링 DB (3)

by oncerun 2022. 9. 5.
반응형

트랜잭션이라는 용어가 왜 사용되는지 알아보자.

 

트랜잭션은 데이터베이스에서 자주 사용되는 용어다. 이는 데이터베이스가 트랜잭션이라는 개념을 롤백과 커밋으로 지원할 수 있기 때문이다. 

다만 이 용어가 애플리케이션단으로 옮겨져 자주 사용되기 때문에 혼란이 가중될 수 있기에 차근차근 이해해보자.

 

 우선 트랜잭션은 특정한 행위들이 하나의 묶음으로 처리되도록 보장하는 장치이다.

 

예를 들어 모든 행위의 데이터베이스 작업이 전부 완료되어야만 정상적인 서비스가 가능한 서비스가 있다. 

만약 이 서비스는 중간에 특정 행위에서 오류가 발생한다면 어떻게 해야 할까?

 

이 경우에는 모든 것은 전부 되돌림으로 써 처음부터 없었던 행위로 처리해야 문제가 발생하지 않는다. 

또한 이러한 트랜잭션의 행위는 데이터베이스의 제약 조건을 항상 만족하여야만 한다. 그래야 중간에 오류가 발생해 롤백되는 현상이 없다. 이 뿐만이 아니라 동시다발적인 트랜잭션 요청을 각각의 격리 수준을 통해 적절하게 처리해야 성능적인 문제가 없고 성공적으로 완료했다면 이 결과는 항상 기록되어야 한다.

 

우리는 이러한 특성을 트랜잭션 ACID라고 한다.

 

데이터베이스 연결 구조

 

클라이언트가 데이터베이스를 활용할 때 각 커넥션마다 데이터베이스 세션을 할당한다. 

이후 해당 커넥션으로 들어오는 데이터베이스 요청은 연결된 세션이 모두 처리한다. 

이는 커넥션의 개수에 따라 세션이 생성됨을 의미한다.  커넥션 풀인 경우에는 애플리케이션 초기화 과정에서 데이터베이스 서버에 지정된 커넥션 개수만큼 세션이 생성되어 있을 것이다. 

이 세션에서는 트랜잭션을 시작하고, 커밋 또는 롤백을 통해 트랜잭션을 종료한다. 이후 새로운 트랜잭션을 다시 시작할 수 있다.

 

우선 데이터베이스를 이용할 때 우리는 커넥션에 할당된 세션을 통해 트랜잭션을 시작하고 종료한다는 것만 기억하고 넘어가자. 

 

 

DB 락

 

DB 락은 많이 발생하는 이슈 중 하나이다.  왜 발생하는지, 기본 개념은 무엇인지 알아보자.  나도 많이 듣긴 했는데 정확한 이해를 하지 않고 얼렁뚱땅 넘어간 것이 기억이 난다. 

 

데이터베이스 락의 개념에 대해 알아보자.

 

애플리케이션의 성능이 낮아지는 문제 중 하나는 동시성 처리관련 문제도 있다. 

특정 로직에서 트랜잭션을 시작하고 종료함에 있어서 트랜잭션의 원자성을 지키기 위해 대기를 하는데, 이 과정에서 지연현상이 발생할 수 있기 때문이다. 물론 트랜잭션 격리 수준에 따라 처리할 수 있지만 이는 다음에 알아보자. 

 

왜 대기를 할까? 

 

하나의 사용자가 데이터베이스 세션을 통해 데이터를 수정하고 있다. 이 과정에서 다른 사용자가 다른 세션을 통해 같은 데이터를 수정한다면 여러가지 문제가 발생할 것이다. 

이런 문제를 방지하기 위해서 트랜잭션을 시작하고 데이터를 수정하는 동안 해당 세션이 커밋 혹은 롤백을 수행하기 전까지 다른 세션에서 해당 데이터를 수정할 수 없게 막는 것이다. 

더보기

( 락 대기 시간은 설정할 수 있다.)

SET LOCK_TIMEOUT <milliseconds>

 

수정에 대해서 락을 사용할 수 있지만 조회할 때도 락을 사용할 수 있다.

 

일반적인 경우에는 조회에 락을 걸지 않지만 필요한 시점이 발생한다.

 

예를 들어 중요한 계산을 하는 로직이 있는데, 해당 로직은 여러 테이블을 조회한 후 그 값을 토대로 계산을 진행한다. 

만약 조회를 하는 순간 다른 세션에서 해당 테이블의 값을 변경을 한다면 문제가 발생한다. 

이런 경우는 조회 시점에 락을 걸어 안전하게 로직을 진행하는 것이 올바르다.

 

조회 락을 획득하고 싶을 땐 select for update 구문을 사용한다. 이렇게 하면 조회시점에 락을 가져가기에 다른 세션에서 해당 데이터를 변경할 수 없다.

더보기

select * from member for update;

 

 

다음에는 트랜잭션 격리 수준, 락, MVCC에 대해 간단히 이해해보자.

 

반응형

'Spring|Spring-boot' 카테고리의 다른 글

Spring DB(6)  (0) 2022.09.27
Spring DB (4)  (1) 2022.09.19
스프링 DB (2)  (0) 2022.08.15
스프링 DB (1)  (0) 2022.08.15
파일 업로드 및 다운로드  (0) 2022.01.26

댓글