본문 바로가기

프로그래밍 언어/Java

자바 Transactional

자바의 Trasncation은 더 이상 쪼갤 수 없는 실행이다. 하나의 실행단위이기에 여러 Thread에 실핼될수 있고 그 중에서는 동시에 실행되서는 안되는 critical한 Transaction이 존재할수 있다.

 

이를 위해 특정 transcation을 고립시켜서 실행시킬수 있게 해주는 Spring transcational annotation이 옵션에 대해 알아보자.

 

발생할수 있는 현상과 현상을 예방할수 있는 방법으로 구성하도록 하겠다.

트랜잭션 동시성과 관련해서 발생할수 있는 현상은 다음과 같은 3가지가 존재한다.

 

1. Dirty Read

Dirty Read는 위의 그림을 보면 쉽게 이해가 가능합니다.

1) Transaction B는 특정 데이터베이스 컬럼값을 Update를 사용해 수정하고 아직 Commit을 사용하지는 않았습니다.

2) Transaction A는 위에서 변경된 값을 Select문을 통해 읽어 들입니다.

3) Transaction B는 RollBack을 통해, 초기값으로 변경합니다.

4) Transaction A는 다시 한번 Select문을 읽어들여서 기존과 다른 값을 읽게 됩니다.

이렇게 Commit이 수행되지 않은 컬럼의 데이터값까지 읽어들여 기존과 다른 값이 나올수 있는 현상을 Dirty Read라고 칭합니다.

2. Non-Repeatable Read

Non Repeatable Read는 위와 유사한데, 위같은 경우는 Commit되지 않은 Row의 값을 읽어들여서 발생되는 현상이였습니다.

이제는 처음 실행될때 읽어들인 값이 중간에 Update에 의해 변형되어서 다시 읽어들일때 처음과는 다른 값을 읽어들이는 현상을 Not-Repeatable Read라고 칭합니다.

3. Phantom Read

Phantom Read는 Insert와 같은 특정 데이터베이스의 Row의 길이를 변화시키는 행위를 다른 Transaction 수행중에 일으키는 현상을 의미합니다.

그렇기에 처음 읽어들일 때 없었던 새로운 Row가 발생할수 있고, 이를 유령이라고 칭하며 Phantom Read현상이라 칭합니다.

Transaction Isolation 고립레벨

Java Transaction 고립레벨에는 4가지가 존재합니다. 

  • Read Uncommited(Level 0)
  • Read Commited(Level 1)
  • Repeatable Read(Level 2)
  • Serializable(Level 3)

발생현상과 고립레벨에 따른 성능

'프로그래밍 언어 > Java' 카테고리의 다른 글

Hash Map과 Hash Collision 문제  (0) 2022.07.10
GC(Garbage Collector)  (0) 2022.07.10
Interface가 왜 필요할까?  (0) 2022.07.09
동기화 처리 Synchronized  (0) 2022.06.12
Stream 확실히 알기  (0) 2022.06.12