나만의 개발 로그 | 고민 로그
트랜잭션이란 본문
트랜젝션이란 데이터 베이스의 상태를 변경시키기 위하여 수행되는 작업의 단위
삽입, 삭제, 수정 등의 처리작업을 하나의 단위로 묶어서 실행하며, 작업 실행 도중 실패 시 해당 작업 전체를 롤백할 수 있다.
이 트랜잭션에는 ACID라는 특징이 있다.
바로 원자성, 일관성, 고립성, 지속성이다.
- 원자성은 한 트랜잭션 내 실행한 작업들은 하나로 간주해서 모두 성공하거나 실패하는 것으로 처리
- 일관성은 데이터베이스는 항상 일관성 있는 상태를 유지해야한다는 것을 의미
트랜잭션 이전과 이후, 데이터베이스의 상태는 이전과 같이 유효해야 한다.
즉, 트랜잭션이 커밋되면 데이터 베이스에 적용한 제약조건(PRIMARY KEY, UNIQUE, NOT NULL 등)을 위반하지 않는다는 보장이 있어야 함 - 고립성은 둘 이상의 트랜잭션이 동시에 실행될 경우 어떤 하나의 트랜잭션이 다른 트랜잭션의 연산에 끼어들 수 없다.
수행중인 트랜잭션이 완전히 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조할 수 없다. - 지속성, 영속성은 결과를 항상 영구적으로 저장해야 함을 의미
즉, 성공적으로 완료된 트랜잭션의 결과는 시스템이 고장나더라도 영구적으로 반영되어야 한다는 걸 의미 -> 로그 저장
Atomicity(원자성)
- 원자성이란 트랜잭션이 안전성 보장을 위해 가져야 할 성질 중의 하나이다.
- 원자성이란 시스템에서 한 트랜잭션의 연산들이 모두 성공하거나, 반대로 전부 실패되는 성질을 말한다.
- 원자성은 작업이 모두 반영되거나 모두 반영되지 않음으로서 결과를 예측할 수 있어야 한다.
Consistency(일관성)
- 일관성은 데이터베이스의 상태가 일관되어야 한다는 성질이다.
- 일관성은 하나의 트랜잭션 이전과 이후, 데이터베이스의 상태는 이전과 같이 유효해야 한다.
- 다시 말해, 트랜잭션이 일어난 이후의 데이터베이스는 데이터베이스의 제약이나 규칙을 만족해야 한다는 뜻이다.
- 예를 들어 ‘모든 고객은 반드시 이름을 가지고 있어야 한다’는 데이터베이스의 제약이 있다고 가정한다.
- 다음과 같은 트랜잭션은 Consistency(일관성)를 위반한다.
- 이름 없는 새로운 고객을 추가하는 쿼리
- 기존 고객의 이름을 삭제하는 쿼리
Isolation(격리성, 고립성)
- 격리성은 모든 트랜잭션은 다른 트랜잭션으로부터 독립되어야 한다는 뜻이다.
- 실제로 동시에 여러 개의 트랜잭션들이 수행될 때, 각 트랜젝션은 고립(격리)되어 있어 연속으로 실행된 것과 동일한 결과를 나타낸다.
예를 들어, 특정 개시물의 조회수를 갱신한다 할때, 42의 조회수를 가졌고, user 두명이 해당 게시물에 접근하면 44로 갱신되어야 한다.
하지만 위 그림처럼 경쟁 조건 때문에 43이 되었다. ACID 에서 격리성은 동시에 실행되는 transaction 은 서로 격리된다는 것을 의미한다.
하나의 트랜잭션이 다른 트랜잭션을 절대로 방해할 수 없다. 이러한 격리성을 직렬성 으로 표현하기도 한다. 각 트랜잭션이 유일한 트랜잭션인 것 처럼 격리시켜 버리는 것을 의미하는데 각 트랜잭션이 순차적으로 실행됐을 때와 동일한 결과를 보여준다.
Durability(지속성)
- 지속성은 하나의 트랜잭션이 성공적으로 수행되었다면, 해당 트랜잭션에 대한 로그가 남아야하는 성질을 말한다.
- 만약 런타임 오류나 시스템 오류가 발생하더라도, 해당 기록은 영구적이어야 한다는 뜻이다.
- 지속성은 성공적으로 commit 된 데이터는 H/W 결함이 발생하거나, DB 가 죽더라도 보존되어야 하며 SSD 와 같은 비휘발성 저장소에 기록됐다는 뜻이다.
ACID 원칙은 완벽히 지켜지지 않는다.
실제로는 ACID 원칙은 종종 지켜지지 않는다.
왜냐하면 ACID 원칙을 strict 하게 지키려면 동시성이 매우 떨어지기 때문이다.
문제가 되는 것은 바로 격리성이다.
트랜잭션간에 격리성을 완벽히 보장하려면 동시에 처리되는 트랜잭션을 거의 차례대로 실행을 해야한다. 하지만 이렇게 처리를 하면 처리 성능이 매우 나빠지게 된다.
그렇기 때문에 DB 엔진은 ACID 원칙을 희생하여 동시성을 얻을 수 있는 방법을 제공한다.
바로 transaction의 격리 수준(isolation level)이다.
ACID중 Isolation(독립성) 원칙을 덜 지키는 level을 사용할수록 문제가 발생할 가능성은 커지지만,
동시에 더 높은 동시성을 얻을 수 있다.
ANSI/ISO SQL standard에서 정의한 격리 수준에는 READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABL이 있다.
1. Read Uncommitted
트랜잭션이 아예 격리가 되지 않는 Isolation Level
동시에 일어나는 트랜잭션 간 commit 여부와 상관없이 모든 변경사항을 확인
안정성 매우 낮으나 속도는 빠름
2. Read Committed
트랜잭션 내 모든 쿼리는 다른 트랜잭션을 통해 정상적으로commit된 데이터만 볼 수 있음
3. Repeatable Read
트랜잭션 중 특정 row를 읽어 들이는 쿼리를 실행한다면 해당 트랜잭션이 끝날 때까지 읽어 들인 row의 데이터는 변하지 않음 (2번 케이스를 보완해서 읽는 중간에 커밋된 사항이 반영되는 걸 방지하기 위함..?)
4. Serializable
가장 엄격한 Isolation Level
트랜잭션이 진행되는 동안 특정 테이블을 읽으면 동시에 진행되는 다른 트랜잭션은 해당 테이블에 데이터를 추가, 변경, 삭제할 수 없음
++
Propagation
이미 트랜잭션이 진행중일 때 추가 트랜잭션 진행을 어떻게 할지 결정하는 것이 전파 속성(Propagation)
전파 속성에 따라 기존의 트랜잭션에 참여할 수도 있고,
별도의 트랜잭션으로 진행할 수도 있고,
에러를 발생시키는 등 여러 선택을 할 수 있음
[Spring] @Transactional - 1 전파 레벨(propagation)
@Transactional 사용시 주의사항 @Transactional을 클래스 또는 메소드 레벨에 명시하면 해당 메소드 호출시 지정된 트랜잭션이 작동하게 된다. 단, 해당 클래스의 Bean을 다른 클래스의 Bean에서 호출할
n1tjrgns.tistory.com
'Computer Science' 카테고리의 다른 글
| Stack과 Queue, Array와 Linked List 설명 및 차이점 (0) | 2023.04.04 |
|---|---|
| 절차지향 / 객체지향 / 함수형 프로그래밍이란 무엇이고 차이점은 무엇인가? (0) | 2023.04.04 |
| 웹서버와 WAS의 차이 (0) | 2023.04.03 |
| TCP / UDP (0) | 2023.03.31 |
| 프로세스(Process)와 쓰레드(Thread)의 차이 (0) | 2023.03.31 |