JS

JavaScript 기본 개념 공부 - 트랜잭션

공대루루 2023. 4. 9. 22:56

데이터 구조가 복잡해지면 복잡해질 수록 트랜잭션이 더더 중요해지는 것 같다.. 트랜잭션 제대로 공부해보고 적용해봐야지!!

트랜잭션(Transaction)이란?

트랜잭션은 작업의 완전성을 보장해주기 위해 사용되는 개념이다. 여러개의 작업을 전부 처리하거나 전부 실패하게 만들어서 데이터의 일관성을 보장해준다. 여러개의 작업을 하나의 작업 단위로 그룹화 하여 처리하는 것이다.

트랜잭션을 사용하면 하나의 단위로 동작해야하는 일련의 과정을 묶어서 처리할 수 있게된다. 예를 들어 돈을 계좌에서 빼고 지불한 후 물건을 받는 일련의 과정은 하나의 묶음으로 동작되어야 한다. 만약 트랜잭션이 없다면 계좌에서 돈을 뺐는데 지불 단계에서 에러가 생겨서 프로그램이 종료되버리면 계좌에서 돈을 뺀 동작만 수행된 채로 끝나버리게 된다. 여기에 트랜잭션을 적용하게 되면 지불단계에서 에러가 생겼을 때 앞서 실행됬던 계좌에서 돈을 빼는 동작도 취소가 된다.

트랜잭션의 특징(ACID)

트랜잭션에는 4가지 특징이 있는데 원자성, 일관성, 격리성, 지속성 이다.

트랜잭션의 4가지 특징 : 원자성, 일관성, 격리성, 지속성

1. 원자성

원자성은 트랜잭션의 가장 대표적인 특징이며 트랜잭션 내에서 실행되는 명령들을 하나의 묶음으로 처리하여, 실행되는 명령들이 전부 성공하거나 전부 실패한다는 것이다.

원자성의 특징을 이용하면 동시에 실행해야 하는 여러개의 쿼리를 묶어서 관리할 수 있고, 여러개의 비즈니스 로직을 상세하게 알지 않더라도 하나의 함수처럼 트랜잭션을 사용할 수 있게 된다.

2. 일관성

일관성은 트랜잭션에서 처리되는 데이터의 일관성을 유지해야 한다는 특징이다. 만약 작업이 성공하면 모든 데이터가 아무 문제없이 저장되고 작업 도중 실패하더라도 실패한 상태로 데이터를 방치하는 것이 아니라 원래 상태로 복구시키는 것이다.

3. 격리성

격리성은 트랜잭션을 수행하는 중간에 상태를 보거나 변경할 수 없도록 구성하는 것이다. 트랜잭션의 실행 전이나 실행 후에는 데이터를 외부에서 참조할 수 있지만 중간에는 사용중인 DB 오브젝트에 을 걸어서 또다른 클라이언트가 해당하는 DB 오브젝트를 읽거나 변경할 수 없다. 

: 하나의 데이터를 여러 사용자가 동시에 변경하려고 할 때 락이 존재하지 않으면 한번에 여러번의 수정이 발생하여 어떤 결과값이 나오게 될지 알수가 없게된다. 이런 상황을 방지하기 위해서 락이라는 기능이 생겼다고 한다!!

※ 락의 종류
- 공유락 , 읽기락
: 다른 트랜잭션이 데이터를 읽는 것은 허용하지만 수정하는 것은 금지한다.  READ 전용 락이라고 한다
: 트랜잭션이 모두 끝나면 공유락은 해제된다.

- 배타락 , 쓰기락
: 다른 트랜잭션이 데이터를 읽거나 수정하는것 모두 금지한다. WRITE 전용락이라고 한다.
: 트랜잭션이 해당하는 데이터를 점유한 후 다른 트랜잭션이 해당 데이터에 접근할 수 없도록 한다.

※ 교착상태란? 여러 테이블에 락을 적용하여, 다른 작업이 끝나는 것을 무한정 기다리는 것을 의미한다. 

4. 지속성

지속성은 트랜잭션이 성공하면 데이터를 시스템에 영구적으로 적용하는 것을 말한다. 트랜잭션의 중간 결과가 아닌 완성된 결과만 저장하여 데이터 베이스에 이상이 생기더라도 자동 복구하는 특성이다.

트랜잭션의 격리 수준

1. READ UNCOMMITED : 가장 낮은 수준의 격리수준이며, 락을 걸지 않아 동시성이 높지만 일관성이 쉽게 깨질 수 있다.

2. READ COMMITED : 다른 트랜잭션이 데이터를 수정하고 있는 중에는 데이터를 읽을 수 없어 커밋되지 않은 읽기현상이 발생하지 않는다.

3. REPEATABLE READ : 공유락이 걸린 상태에서 데이터를 수정하는 것은 불가능하지만, 데이터를 삽입하는 것이 가능해진다.

4. SERIALIZABLE : 데이터를 읽는 동안 다른 트랜잭션이 해당 데이터를 읽거나 삽입할 수 없고, 새로운 데이터를 추가하는 것 또한 불가능하다. -> 동시성이 떨어짐