Transaction(트랜잭션)

시모키타자와·2022년 10월 9일
0

SpringDB

목록 보기
3/8

트랜잭션이란 무엇일까?

application를 만들다 보면 service 로직에서 항상 @Transaction 어노테이션을 사용했으며 트랜잭션이라는 말을 많이 들어 보았다.

이 트랜잭션이란 무엇이길래 사용을 하는 것일까?

트랜잭션은 이름 그대로 거래라는 뜻이다.

사람A가 사람B에게 macbook를 1000원에 구매한다고 하자,

사람A가 1000원 B에게 주었을 때 A는 macbook를 받아야 한다. 하지만, 1000만 주었을 뿐
macbook를 받지 못한다면, 어떻게 될까? A는 손해를 입게 될것이다. 이런 문제가 애플리케이션에서 일어나게 된다면, 그 서비스는 망하게 된다.

Transaction이란 거래를 할 때 A도 macbook를 받게 된다면 완전한 거래를 했기 때문에 데이터 베이스에 정상적인 반영으로 commit를 하게 되고,
정상적인 거래가 아니였다면 Rollback를 하여 다시 원상태를 복구하게 된다.

Transaction의 ACID란

원자성Atomicity, 일관성Consistency, 격리성Isolation, 지속성Durability을 뜻하는 말이다


원자성Atomicity : 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하거나 실패 해야한다.

사람A가 1000원을 주는 것이 작업1,
사람B가 맥북을 주는 것이 작업2
그렇기 때문에 모두 성공하거나 실패해야된다.

일관성Consistency : 모든 트랜잭션은 일관성이 있는 데이터를 유지해야 한다. 예를 들어서 db에서 정한 무결성 제약 조건을 항상 만족해야 한다.

null값 또는 중복 값 등등을 허용하지 않는다고 규약을 걸어놓으면 허용하지 않아야한다.

격리성Isolation : 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리해야 한다.

격리성을 완벽하게 보장하려면 트랜잭셕을 순서대로 진행해야 한다. 하지만 성능의 문제가 생기므로 트랜잭션 격리 수준 4단계에서 READ COMMITTED(커밋된 읽기), REPEATABLE READ(반복 가능한 읽기) 를 선택한다.

READ UNCOMMITED(커밋되지 않은 읽기)는 너무 무차별적이고, SERIALIZABLE(직렬화 가능)는 성능의 문제가 생긴다

지속성Durability : 트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 한다.

에러 발생시 로그로 찍어서 확인할 수 있어야 한다

유저가 web를 통해 요청한 데이터가 server에 전달된다. 서버는 유저의 데이터를 db에 반영하기 위해 만들어둔 connection pool에서 connection를 꺼내어 db에 데이터를 전송한다. 이때 사용하는 커넥션는 db에서 만들어지는 세션과 연결되고 세션이 sql를 실행 트랜잭션을 시작, 커밋, 롤백 등을 사용한다.

우리가 애플리케이션을 만들때 로컬 db인 h2를 사용할 때 db의 username과 password를 설정을 하는 데 이것으로 세션을 만드는 것이다.

트랜잭션 사용

트랜잭션은 commit를 통해 데이터를 반영하고 rollbak를 통해 데이터 반영을 취소한다. commit를 하기 전까지는 데이터가 임시 로 저장된다. 따라서 트랜잭션을 시작한 세션에게만 보이고 다른 세션에게는 보이지 않는다(빨간영역 비어있음).

만약 다른 세션에게도 보이게 된다면,문제가 생긴다
예를 들어서 세션1에서 상품을 주문을 commit를 하지않았다. 하지만 세션2에서 볼 수 있게 된다면 배달로직은 주문정보가 있으므로 배달이 시작될 것이다. 세션1에서 rollback를 하게 된다면 배달db에서 주문 정보가 다 사라지게 된다면 엄청 큰 장애가 발생한다.

트랜잭션은 수동commit과 자동commit이 있는데, 자동commit를 하게 된다면, 바로바로 데이터가 반영되기에 장애가 일어난다, 수동commit는 commit를 해줘야만 데이터가 반영되기 때문에 sql문이 잘못되었을 때 데이터를 rollback하여 문제가 일어나는 것을 방지할 수 있다.

그렇기 때문에, 수동commit를 할 때 트랜잭션이 시작된다고 말 할 수가 있다.

profile
Back-end Engineer

0개의 댓글