(Spring)Transaction이란?

 

 

Transaction이란?

더 이상 나눌 수 없는 작업의 단위를 일컫는다.(Tx)

insert, update, select 처럼 명령 하나하나가 트랜잭션이다.

 


트랜잭션의 속성 - ACID

1️⃣ 원자성(Atomicity) - 나눌 수 없는 하나의 작업으로 다뤄져야 한다.

2️⃣ 일관성(Consistency) - Tx 수행 전과 후가 일관된 상태를 유지해야 한다.

3️⃣ 고립성(Isolation) -  각 Tx는 독립적으로 수행되어야 한다.

4️⃣ 영속성(Durability) - 성공한 Tx의 결과는 유지되어야 한다.


커밋과 롤백

- 커밋(commit) - 작업 내용을 DB에 영구적으로 저장

- 롤백(rollback) - 최근 변경사항을 취소(마지막 커밋으로 복귀)


자동 커밋과  수동 커밋

- 자동 커밋 - 명령 실행 후 , 자동으로 커밋이 수행(rollback불가)

- 수동 커밋 - 명령 실행 후 , 명시적으로 commit 또는 rollback을 입력


Tx의 Isolation level

- Isolation leve이란 각 Tx를 고립시키는 정도를 의미한다.

- 여러 가지 트랜잭션이 겹치게 동시에 돌아가도록 해야  적은 하드웨어 자원으로 많은 사람들이 사용할 수 있다.

 

1️⃣ READ UNCOMMITED

- 커밋되지 않은 데이터도 읽기 가능하다.

- dirty read라고도 한다.

- 고립도의 강도가 가장 낮다.

- ex) Tx1에서 tmp테이블에 데이터를 insert 하고 커밋하지 않아도, 다른 트랜잭션인 Tx2에서 tmp테이블을 select한 경우 Tx1에서 insert한 결과가 조회된다.

 

2️⃣ READ COMMITED

- 커밋된 데이터만 읽기 가능하다.

- phantom read라고도 한다.

- ex) Tx1에서 tmp테이블에 데이터를 insert 하고 커밋하지 않았으면, 다른 트랜잭션인 Tx2에서 tmp테이블을 select한 경우 Tx1에서 insert한 결과는 조회되지 않고 insert 이전의 데이터만 조회된다.

 

3️⃣ REPEATABLED READ

- 반복해서 읽기 가능하다.

- Tx가 시작된 이후 변경은 무시된다.

- 반복적으로 select문을 수행해도 같은 결과가 나온는 것을 Repeatabled Read라고 한다.

- Tx의 속성중 Isolation(고립성) 즉 각 Tx는 독립적으로 수행되어야 한다는 것을 구현

- defalut로 지정되어 있다.

- ex) Tx1에서 tmp테이블을 select하고 Tx2에서 이후 tmp 테이블에 데이터를 insert하고 commit을 한 후 Tx1에서 tmp테이블을 select 하여도 Tx2가 insert한 데이터는 보이지 않는다. 즉 Tx1의 트랜잭션이 끝난 후 다시 트랜잭션을 시작해야 Tx2의 insert한 데이터가 보여지게 된다.

 

4️⃣ SERIALIZABLE

- 한번에 하나의 Tx만 독립적으로 수행된다.

- 고립도가 제일 강하다.

- 각 트랜잭션이 직렬로 독립적으로 수행된다.

- 성능은 떨어지지만 데이터의 품질은 올라간다.

- ex) Tx1이 tmp테이블을 select하고 작업을 수행하는 중이고, Tx2가 tmp테이블에 데이터를 insert하려고 하면 Tx1의 트랜잭션이 아직 끝나지 않았기 때문에 데이터가 insert 되지 않고 대기 상태가 된다.

Tx1에서 commit이 일어나고 트랜잭션이 끝나면 그때서 Tx2의 insert가 수행되어 데이터가 들어간다.

만약  Tx1이 select가 아닌 tmp 테이블에 insert로 트랜잭션을 시작 하였고, 이 후 Tx2가 tmp테이블을 select 하였다면 Tx1의 insert가 끝나지 않았기 때문에 Tx2의 select 또한 대기상태가 된다.

'Spring' 카테고리의 다른 글

(Spring) Juit4 TDD  (0) 2022.09.25
(Spring)@GetMapping & @PostMapping  (0) 2022.09.04
(Spring)@WebDataBinder  (0) 2022.09.04
(Spring)@ModelAttribute  (0) 2022.09.04
(Spring)@RequestParam  (0) 2022.09.04