CS/DataBase

(MySQL) ACID : 트랜잭션을 통한 동시성 제어

주누 2020. 3. 8. 12:45

데이터베이스 요청은 순차적으로 선형 시간에 발생한다.
많은 유저들이 데이터베이스에 접근하거나 한 명의 유저가 요청을 실행 중일 때 해당 결과에 대해서 일관성을 보장하는 것이 중요하게 되었다.
일관성을 유지하기 위해서는,  전반적으로 처리되는 요청의 그룹인 트랜잭션을 사용해야 한다.
즉 트랜잭션은 논리적인 작업 단위이다.

원자성 (Atomicity)

원자성은 트랜잭션이 반드시 완수되어야 함을 의미한다. 만일 원자성을 따르지 않는다면 트랜잭션은 붕괴된다.

원자성은 데이터 무결성을 망가뜨리는 부분적으로 완료된 트랜잭션으로 절대로 남아있지 않도록 보장한다.

 

예시

은행에서 돈을 인출한다고 가정하자
인출을 완료하였지만 두 번째 요청이 실패하여 해당 시스템은 또 다른 은행에서 돈을 꺼내올 수 없는 경우 두 요청 모두 실패해야 한다.

동시성 (Consistency)

동시성은 특정 상태에서의 데이터의 상태를 나타낸다.

 

예시 

예를 들어 인보이스는 고객 테이블에 고객과 연관되어야 한다는 규칙이 있다고 가정하자.
이러한 규칙은 특정 상황의 트랜잭션 과정 동안 어긋날 수도 있다. 예를 들어 인보이스가 관련 고객 없이 삽입되어 거래 후반에 추가되는 경우 거래 과정 중에 이러한 규칙이 위반될 수 있습니다.
이러한 일시적인 위반사항은 트랜잭션 외부에서는 보이지 않는다 그리고 항상 트랜잭션이 완료되는 시점에 해결된다.

 


고립성 (Isolation)

고립성은 하나의 트랜잭션이 진행 중일 때 사용 중인 데이터는 처음 트랜잭션이 완료될 때까지 또 다른 트랜잭션에서 사용되면 안 된다는 것을 의미한다.

 

예시

A라는 값이 1000이라는 값이 있고, B라는 값이 2000이라는 값이 있는데 처음 시작했을 때, A+B를 해서 3000이라는 값을 저장하였다.
그러나 다른 트랜잭션이 A의 값을 1500으로 변경하여, 마지막에 한번 더 A+B를 해서 3500으로 변경이 되었다면 처음과 마지막의 연산 값이 틀려서 문제가 발생할 것이다.

지속성 (Durablility)

지속성은 트랜잭션의 어떠한 데이터가 커밋된다면 시스템에 문제가 생긴 이후에도 효력이 남아있다는 것이다.

트랜잭션이 진행되는 동안 그 효력은 지속되지 않는다.

 

만일 데이터베이스에 문제가 생긴다면 백업은 항상 트랜잭션을 시작하기 전에 항상 일관된 상태로 복원한다. 어떠한 트랜잭션도 이러한 사실을 변화시킬 수 없다.

 

커밋을 하면 현재 상태는 영원히 보장된다.

 


References

https://mariadb.com/kb/en/acid-concurrency-control-with-transactions/

 

ACID: Concurrency Control with Transactions

Ensuring data integrity.

mariadb.com