잡다한지식

ACID , Transaction(트랜잭션) , Procedure (프로시져)에 대해

류창 2023. 6. 5. 17:17
반응형

 

 

우선 ACID 부터 이해를 해야, 

후에 설명하는 트랜잭션과 프로시져에 대한 이해가 쉽다.

 

 

ACID 란?

 

ACID는 데이터베이스 관리 시스템(DBMS)에서 데이터의 무결성과 일관성을 보장하기 위한 속성을 나타내는 약어입니다. ACID는 다음과 같은 네 가지 속성으로 구성됩니다:

1. 원자성(Atomicity): 트랜잭션의 모든 작업은 원자적으로 처리되어야 합니다. 즉, 트랜잭션 내의 모든 작업은 전체적으로 성공하거나 전혀 적용되지 않아야 합니다. 작업 중 하나가 실패하면, 이전 상태로 롤백되어야 합니다.

2. 일관성(Consistency): 트랜잭션 전후에 데이터베이스는 일관된 상태를 유지해야 합니다. 즉, 트랜잭션이 실행되기 전과 실행된 후의 데이터베이스 상태는 일관성이 있어야 합니다. 데이터베이스에 정의된 규칙, 제약 조건, 관계 등이 깨지지 않아야 합니다.

3. 격리성(Isolation): 동시에 실행되는 여러 트랜잭션들은 서로 영향을 주지 않도록 격리되어야 합니다. 한 트랜잭션이 다른 트랜잭션의 작업에 끼어들지 않고, 서로의 작업을 간섭하지 않아야 합니다. 이를 통해 각 트랜잭션은 독립적으로 실행되는 것처럼 보여야 합니다.

4. 지속성(Durability): 트랜잭션이 성공적으로 완료되면, 그 결과는 영구적으로 유지되어야 합니다. 시스템 장애나 손상된 상태에서도 데이터는 지속되어야 합니다. 성공적으로 커밋된 트랜잭션의 결과는 복구 가능해야 합니다.

ACID 속성은 데이터의 무결성과 일관성을 보장하기 위해 중요합니다. 이 속성들을 유지하기 위해 DBMS는 로깅, 복구 메커니즘, 동시성 제어 기법 등을 사용합니다. 트랜잭션을 사용하여 데이터베이스 작업을 묶고 ACID 속성을 준수함으로써, 안정적이고 신뢰할 수 있는 데이터 관리를 할 수 있습니다.

 

 

 

여기서 주목해야하는건  A 와 I  원자성과  격리성이다.

 

트랜잭션끼리는  서로의 작업을 간섭할수없으며,   트랜잭션 작업중 실패가되면, 트랜잭션 이전상태로 되돌리며  작업이 무사히 완료되면 Commit을 하는  RDBMS라면 지켜져야하는 이론이다.

 

 

 

 

여기서 트랜잭션 이라는 개념이 나온다.

 

그래서 트랜잭션이란?



트랜잭션은 데이터베이스에서 원자성, 일관성, 격리성, 지속성(ACID)을 보장하기 위한 작업의 논리적 단위입니다. 트랜잭션은 하나 이상의 데이터베이스 작업을 묶어서 원자적으로 처리하는 것을 의미합니다. 예를 들어, 은행 송금 기능에서 돈을 출금하고 입금하는 두 개의 데이터베이스 작업이 있을 때, 이 두 작업은 트랜잭션으로 묶여서 실행됩니다. 트랜잭션은 모든 작업이 성공적으로 완료되면 커밋(Commit)되어 영구적으로 데이터베이스에 적용되고, 작업 중 하나라도 실패하면 롤백(Rollback)되어 이전 상태로 되돌립니다. 이를 통해 데이터의 일관성과 무결성을 유지할 수 있습니다.

 

 

즉,  쿼리를 묶어서  거대한 쿼리 덩어리 = 메소드 로 만들어둔다 라는 개념이 크다.

그 거대한 쿼리 덩어리는  ACID라는 속성을 가졋다 라고 보면된다.

 

 

1
2
3
4
5
6
7
8
9
10
11
BEGIN TRANSACTION
 
UPDATE Customers
SET Balance = Balance - 100
WHERE CustomerId = 1
 
INSERT INTO Orders (CustomerId, OrderDate)
VALUES (1, GETDATE())
 
COMMIT
 
cs

 

트랜잭션의 예시이다.

 

그렇다면 프로시져는 ?

 

정확하게 말씀드리자면, 프로시저(Stored Procedure) 자체가 ACID(원자성, 일관성, 격리성, 지속성)를 제공하는 것은 아닙니다. ACID는 주로 트랜잭션(Transaction)에서 적용되는 개념입니다.

프로시저는 데이터베이스에서 실행되는 코드 블록으로, 특정 작업을 수행하기 위해 사용됩니다. 프로시저는 데이터베이스 서버에서 실행되며, 일련의 SQL 문들을 포함할 수 있습니다. 프로시저는 자체적으로 트랜잭션을 구성하지 않으며, 호출된 프로시저 내부에서 트랜잭션을 사용할 수 있습니다. 따라서, 프로시저 내에서 트랜잭션을 정의하고 관리하여 ACID 속성을 적용할 수 있습니다.

요약하자면, 프로시저는 자체적으로 ACID를 제공하는 것은 아니며, 프로시저 내에서 트랜잭션을 사용하여 ACID 속성을 보장할 수 있습니다.

 

 

즉,  프로시져는  트랜잭션에서 ACID 요소가 빠진 그냥, 거대한 코드 블록이다.

하지만 이 코드 블록안에 트랜잭션을 넣을수 있으니,   만약 트랜잭션을 넣는다면  일부분 ACID효과를 누릴수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE PROCEDURE CreateOrder
    @CustomerId INT,
    @ProductId INT,
    @Quantity INT
AS
BEGIN
    -- 새로운 주문 생성
    INSERT INTO Orders (CustomerId, ProductId, Quantity, OrderDate)
    VALUES (@CustomerId, @ProductId, @Quantity, GETDATE())
 
    -- 재고 갱신
    UPDATE Inventory
    SET Quantity = Quantity - @Quantity
    WHERE ProductId = @ProductId
END
 
cs

 

프로시져의 예시이다. 

 

 

 

트랜잭션 vs 프로시져

 

이 2개의 기능에 많은 토론이 벌어져있다.

 

본인이 생각할때는 다음과 같을때 활용을 할 것 같다.

 

1. 성능이 중요한가?

 

성능면만 따져보면,  프로시져 > 트랜잭션이다.

그 이유는, 프로시져는 ACID란 규칙이 적용이 되지않으므로,  성능면에선 뛰어나다고 밖에 볼수 없다.

 

즉, 성능을 중요시하면 프로시져를 우선시 해야한다.

 

2. 데이터 처리의 원자성과  일관성이 중요한가?

 

데이터베이스에서 특정 작업이 보안요구사항 또는 조건이 필요한 경우, 트랜잭션을 우선시 하는게 옳다.

 

 

 

 

 

 

 

 

 

반응형