728x90
반응형

Chapter13. 교착 상태(데드락)

학습목표

  • 교착 상태가 무엇인지 이해합니다
  • 교착 상태는 어떤 상황에서 발생하는지 이해합니다
  • 교착 상태를 예방하고, 회피하고, 검출하는 방법을 학습합니다

**교착 상태(Deadlock)**란?

  • 여러 프로세스나 스레드가 서로 자원을 기다리며 무한정 대기 상태에 빠져 작업을 진행하지 못하는 상황

발생 상황

  • 상호 배제 상황일 때
  • 자원을 점유하고 대기할 때
  • 자원을 비선점 상태일때
  • 자원을 해제하지 않고 무한 대기할 때

예방 방법

  • 자원 할당 전에 모든 자원을 확보
  • 요청 순서를 정해 자원 할당

회피 방법

  • 자원 상태를 모니터링해 교착 상태가 발생하지 않도록 조정
  • 은행원 알고리즘을 사용

검출 방법

  • 시스템의 자원 그래프를 사용해 교착 상태를 검사
  • 주기적으로 검사하여 교착 상태를 해결
728x90
반응형

'코딩공부 > 운영체제' 카테고리의 다른 글

Chapter15. 파일 시스템  (1) 2024.10.25
Chapter14. 가상 메모리  (1) 2024.10.25
Chapter12. 프로세스 동기화  (0) 2024.10.24
Chapter10. 프로세스와 스레드  (2) 2024.10.24
Chapter09. 운영체제 시작하기  (0) 2024.10.24
728x90
반응형

1. 트랜잭션의 개념

트랜잭션(Transaction)은 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위입니다. 이는 여러 개의 연산을 하나의 논리적 단위로 묶어 처리하는 것을 의미합니다. 트랜잭션의 주요 목적데이터의 일관성을 유지하고 안정적인 데이터베이스 상태를 보장하는 것입니다.

1.1 트랜잭션의 특성 (ACID)

트랜잭션은 다음 네 가지 특성을 가집니다:

  1. 원자성(Atomicity): 트랜잭션의 모든 연산이 완전히 수행되거나 전혀 수행되지 않아야 합니다.
  2. 일관성(Consistency): 트랜잭션 실행 전후의 데이터베이스 상태가 일관되어야 합니다.
  3. 격리성(Isolation): 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않아야 합니다.
  4. 지속성(Durability): 성공적으로 완료된 트랜잭션의 결과는 영구적으로 반영되어야 합니다.

2. 주요 트랜잭션 명령어

2.1 COMMIT

COMMIT은 트랜잭션의 모든 변경사항을 데이터베이스에 영구적으로 저장합니다.

2.2 ROLLBACK

ROLLBACK은 트랜잭션의 모든 변경사항을 취소하고 이전 상태로 되돌립니다.

BEGIN TRY
    BEGIN TRANSACTION;
    
    UPDATE accounts SET balance = balance - 100 WHERE id = 1;
    UPDATE accounts SET balance = balance + 100 WHERE id = 2;
    
    COMMIT TRANSACTION;
    PRINT 'Transaction committed successfully';
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION;
    PRINT 'Error in transaction. Rolled back.';
    PRINT ERROR_MESSAGE();
END CATCH

3. 추가적인 트랜잭션 개념

3.1 SAVEPOINT

SAVEPOINT는 트랜잭션 내에서 중간 지점을 표시하는 데 사용됩니다. 이를 통해 트랜잭션의 일부만 롤백할 수 있습니다.

BEGIN TRANSACTION;

INSERT INTO orders (customer_id, product_id) VALUES (1, 101);
SAVE TRANSACTION order_placed;

UPDATE inventory SET stock = stock - 1 WHERE product_id = 101;

-- 재고가 부족한 경우를 가정
IF (SELECT stock FROM inventory WHERE product_id = 101) < 0
BEGIN
    ROLLBACK TRANSACTION order_placed;
    PRINT 'Insufficient stock. Order placement rolled back.';
END
ELSE
BEGIN
    COMMIT TRANSACTION;
    PRINT 'Order placed and inventory updated successfully';
END

 

3.2 트랜잭션 격리 수준

트랜잭션 격리 수준은 동시에 실행되는 트랜잭션들 간의 상호작용을 제어합니다. MySQL에서는 다음 네 가지 격리 수준을 제공합니다:

  1. READ UNCOMMITTED
  2. READ COMMITTED
  3. REPEATABLE READ (MySQL의 기본 격리 수준)
  4. SERIALIZABLE

3.3 자동 커밋(Auto-commit)

많은 데이터베이스 시스템에서는 기본적으로 자동 커밋 모드가 활성화되어 있습니다. 이 모드에서는 각 SQL 문이 자동으로 커밋됩니다.

Node.js에서 자동 커밋 비활성화 예:

await connection.execute('SET autocommit = 0');

 

4. 트랜잭션 사용 시 주의사항

4.1 데드락 방지

여러 트랜잭션이 서로의 잠금을 기다리며 무한히 대기하는 상황을 데드락이라고 합니다. 이를 방지하기 위해 트랜잭션의 순서를 일관되게 유지하고, 필요 이상으로 긴 트랜잭션을 피해야 합니다.

4.2 장기 트랜잭션 관리

너무 긴 트랜잭션은 다른 트랜잭션의 실행을 방해할 수 있습니다. 가능한 트랜잭션의 실행 시간을 짧게 유지하고, 필요한 경우 큰 트랜잭션을 여러 개의 작은 트랜잭션으로 나누는 것이 좋습니다.

결론

트랜잭션은 데이터베이스의 일관성과 무결성을 유지하는 데 필수적인 개념입니다. COMMIT과 ROLLBACK은 기본적인 트랜잭션 제어 명령어이지만, SAVEPOINT, 격리 수준, 자동 커밋 등의 개념을 이해하고 적절히 활용하면 더욱 효과적인 데이터베이스 관리가 가능합니다.

 

트랜잭션을 올바르게 사용하면 데이터의 안전성을 보장하고 복잡한 비즈니스 로직을 구현할 수 있습니다. 그러나 동시에 데드락이나 성능 저하와 같은 문제를 피하기 위해 주의해야 합니다. 트랜잭션의 범위를 최소화하고, 필요한 경우에만 사용하며, 적절한 격리 수준을 선택하는 것이 중요합니다.

 

최종적으로, 트랜잭션은 데이터베이스 프로그래밍에서 핵심적인 개념이며, 이를 제대로 이해하고 활용하는 것은 안정적이고 신뢰할 수 있는 애플리케이션 개발의 기초가 됩니다.

 

 

728x90
반응형

+ Recent posts