Transaction, ACID

JUN·2021년 4월 11일
0
post-custom-banner

Transaction

트랜잭션이란 여러 개의 작업들을 하나의 실행 유닛으로 묶어준 것입니다.
각 트랜잭션은 하나의 특정 작업으로 시작을 해 묶여 있는 모든 작업들을 다 완료해야 끝나게 되어 있습니다. 만약에 한 개의 작업이라도 실패하게 된다면 전부 실패를 하게 됩니다.

다시 말해 작업이 하나라도 실패를 하게 되면 트랜잭션도 실패이고 모든 작업이 성공적이면 트랜잭션 또한 성공적이게 됩니다.
트랜잭션은 성공 혹은 실패 이 두개의 결과만 존재한다.

테이터베이스 트랜잭션의 정의는 ACID 특성을 가지고 있습니다.

*쿼리 : 데이터베이스에 정보를 요청하는 것.
웹서버에 특정한 정보를 보여달라는 웹 클라이언트 요청(주로 문자열을 기반으로 한 요청)에 의한 처리이다.

ACID

ACID는 Atomicity, Consistency, Isolation, Durability를 의미합니다.
각 단어들은 데이터베이스 내에서 일어나는 하나의 트랜잭션의 안전성을 보장하기 위해 필요한 성질들 입니다.

  • Atomicity (원자성)
    하나의 트랜잭션이 전부 성공하거나 전부 실패해야 된다는 성질입니다. 부분적으로 실행이 되면 안됩니다.

예를 들어 설명하겠습니다.
계좌이체를 한다고 했을 때 계좌 이체는 두 가지 단계로 진행됩니다.
1. 계좌 A에서 돈을 꺼냅니다.
2. 계좌 B에 돈을 추가합니다.
만약에 계좌 이체에서 1번만 수행되거나 2번만 수행이 된다면 돈이 제대로 이체가 되지 않아 문제가 발생하게 됩니다. 두 가지 단계 중 하나라도 성공하지 못하면 전부 실패로 돌아가야 한다는 것이 원자성입니다.

  • Consistency (일관성)
    데이터베이스 상태 일관성에 대한 성질입니다. 하나의 트랜잭션 이전과 이후 데이터베이스 상태는 이전과 같이 유효해야 한다는 뜻입니다.
    즉, 데이터베이스의 제약이나 규칙에 의거한 데이터베이스이어야 한다는 뜻입니다.

예를 들어 설명하겠습니다.
각 고객은 이름이 있어야 하는 데이터베이스 제약이 있다고 하겠습니다.
다음과 같은 트랜잭션들은 해당 성질을 위반합니다.
-이름 없는 새로운 고객을 추가하는 쿼리
-기존 고객의 이름을 삭제하는 쿼리
각 데이터베이스의 유효한 상태는 다를 수 있지만 상태에 대한 일관성은 변하지 않아야 한다. 위 예시에서는 '이름이 있어야 한다'라는 제약을 위반하고 있습니다.

  • Isolation (고립성)
    하나의 트랜잭션이 다른 트랜잭션과 독립되어야 한다는 뜻입니다.
    실제로 동시에 여러 개의 트랜잭션들이 수행될 때에 각 트랜잭션은 고립되어 있어 연속으로 실행된 것과 동일한 결과를 나타내야 합니다.
    또, 트랜잭션 작업 수행 중에는 다른 트랜잭션에 영향을 주어서도 안되고, 다른 트랜잭션들에 의해 간섭을 받아서도 안된다는 것을 의미를 가집니다.

예를 들어 설명하겠습니다.
계좌에 만 원이 있다고 가정해보겠습니다.
1.해당 계좌로부터 계좌 B로 6천원의 계좌 이체와 계좌 C에 6천원의 계좌 이체를 동시에 하는 경우
2.연속으로 계좌 B에 먼저 보낸 뒤 계좌 C에 보내는 경우
두 경우의 결과가 동일해야 한다는 의미 입니다.
즉, 동시에 한다고 해서 각각 6천원씩 계좌 이체 후에 마이너스 통장이 되는 것이 아닌 연속으로 하는 것과 동일한 결과를 나타내야 합니다.
이에 따라 각 트랜젝션은 다른 트랜젝션의 연산 내용을 알 수 없습니다. 또한 동시에 실행될 때와 연속으로 실행될 때의 데이터베이스 상태가 동일해야 합니다.

  • Durability (지속성)
    하나의 트랜잭션이 성공적으로 수행되었다면 해당 트랜잭션에 대한 로그가 남고 런타임 오류나 시스템 오류가 발생해도 해당 기록은 영구적이어야 한다는 뜻입니다.

예를 들어 설명하겠습니다.
은행에서 계좌이체를 성공적으로 한 뒤에 해당 은행 데이터베이스에 오류가 발생해 종료되어도 계좌이체 내역은 남아있어야 합니다.
만약, 계좌이체를 로그로 기록하기 전에 시스템 오류 등에 의해 종료가 된다면 해당 이체 내역은 실패로 돌아가고 각 계좌들은 계좌이체 이전 상태들로 돌아가게 됩니다.

profile
Developer
post-custom-banner

0개의 댓글