본문 바로가기
개발일지/데이터베이스

트랜잭션 관리 및 동시성 제어

by Peter.JH 2024. 11. 25.
728x90
반응형

출처: https://www.geeksforgeeks.org/transaction-in-dbms/

 

백엔드 개발자는 데이터베이스와 상호 작용할 때 트랜잭션 관리와 동시성 제어를 이해하고 효과적으로 활용하는 것이 필수적입니다. 트랜잭션은 데이터베이스의 일관성과 무결성을 보장하는 핵심 개념이며, 동시성 제어는 여러 사용자가 동시에 데이터에 접근할 때 발생할 수 있는 문제를 해결하는 메커니즘입니다. 

 


 

트랜잭션(Transaction) 이해하기

 

트랜잭션의 정의

트랜잭션(Transaction)은 데이터베이스 내에서 수행되는 일련의 연산을 하나의 논리적 단위로 묶은 것입니다. 트랜잭션은 모든 연산이 성공적으로 완료되거나, 하나라도 실패할 경우 전체가 취소되어 데이터의 일관성을 유지합니다.

 

ACID 특성

트랜잭션은 ACID라는 네 가지 핵심 특성을 만족해야 합니다.

  • Atomicity (원자성): 트랜잭션 내의 모든 연산이 모두 완료되거나, 전혀 수행되지 않음. 중간에 실패하면 이전 상태로 되돌림.
  • Consistency (일관성): 트랜잭션이 완료되면 데이터베이스는 일관된 상태를 유지해야 함. 트랜잭션 전후로 데이터 무결성 제약 조건을 만족해야 함.
  • Isolation (격리성): 동시에 실행되는 트랜잭션들이 서로 간섭하지 않아야 함. 각 트랜잭션은 독립적으로 수행되는 것처럼 행동해야 함.
  • Durability (내구성): 트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 저장되어야 함. 시스템 장애가 발생해도 데이터는 보존됨.
-- 트랜잭션의 예제 (PostgreSQL)
BEGIN;

UPDATE Accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE Accounts SET balance = balance + 100 WHERE user_id = 2;

COMMIT;

 

 


 

트랜잭션 관리 메커니즘

 

트랜잭션의 시작과 종료

트랜잭션은 BEGIN 명령어로 시작하여, COMMIT 또는 ROLLBACK 명령어로 종료됩니다.

  • BEGIN: 트랜잭션의 시작을 알림.
  • COMMIT: 트랜잭션 내의 모든 변경 사항을 영구적으로 저장.
  • ROLLBACK: 트랜잭션 내의 모든 변경 사항을 취소하고 이전 상태로 되돌림.

 

트랜잭션 제어 명령어

BEGIN

트랜잭션을 시작하는 명령어로, 이후의 모든 명령어는 하나의 트랜잭션으로 묶입니다.

BEGIN;

COMMIT

트랜잭션을 완료하고, 모든 변경 사항을 데이터베이스에 영구적으로 저장합니다.

COMMIT;

ROLLBACK

트랜잭션을 취소하고, 트랜잭션 시작 이전의 상태로 되돌립니다.

ROLLBACK;

 

 


 

동시성 제어 메커니즘

 

동시성 제어는 여러 트랜잭션이 동시에 실행될 때 데이터의 일관성과 무결성을 유지하기 위해 사용되는 메커니즘입니다. 주요 동시성 제어 기법에는 잠금(Locking), 멀티버전 동시성 제어(MVCC), 그리고 다양한 격리 수준(Isolation Levels)이 포함됩니다.

 

잠금(Locking)

잠금은 데이터베이스 자원에 대한 접근을 제어하여 동시성 문제를 해결하는 방법입니다.

공유 잠금(Shared Lock)

공유 잠금은 데이터를 읽는 작업에 사용됩니다. 여러 트랜잭션이 동시에 데이터를 읽을 수 있지만, 데이터를 수정하려는 트랜잭션은 대기해야 합니다.

BEGIN;

SELECT * FROM Accounts WHERE user_id = 1 FOR SHARE;

-- 공유 잠금을 사용하여 데이터를 읽음

COMMIT;

배타 잠금(Exclusive Lock)

배타 잠금은 데이터를 수정하는 작업에 사용됩니다. 한 트랜잭션이 배타 잠금을 획득하면, 다른 트랜잭션은 해당 데이터에 접근할 수 없습니다.

BEGIN;

SELECT * FROM Accounts WHERE user_id = 1 FOR UPDATE;

-- 배타 잠금을 사용하여 데이터를 수정함

UPDATE Accounts SET balance = balance - 100 WHERE user_id = 1;

COMMIT;

 

멀티버전 동시성 제어(MVCC)

 

멀티버전 동시성 제어(MVCC)는 데이터의 여러 버전을 유지하여 읽기 작업과 쓰기 작업이 서로 간섭하지 않도록 하는 방법입니다. MVCC는 읽기 작업이 쓰기 작업에 영향을 받지 않도록 하여 높은 동시성을 제공합니다.

  • 장점: 높은 읽기 성능, 데드락 감소
  • 단점: 추가적인 저장 공간 필요, 복잡한 구현
-- PostgreSQL은 MVCC를 기본으로 사용
BEGIN;

-- 읽기 작업
SELECT * FROM Accounts WHERE user_id = 1;

-- 쓰기 작업
UPDATE Accounts SET balance = balance - 100 WHERE user_id = 1;

COMMIT;

 

격리 수준(Isolation Levels)

 

격리 수준은 트랜잭션 간의 상호작용을 제어하여 일관성을 유지하는 방법을 정의합니다. SQL 표준에서는 네 가지 격리 수준을 정의하고 있습니다.

Read Uncommitted

가장 낮은 격리 수준으로, 다른 트랜잭션의 미완료된 변경 사항을 읽을 수 있습니다.

  • 장점: 높은 동시성
  • 단점: 더티 리드, 논리적 오류 발생 가능
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

Read Committed

다른 트랜잭션의 커밋된 변경 사항만 읽을 수 있습니다. 더티 리드를 방지하지만, 반복 가능 리드는 보장하지 않습니다.

  • 장점: 합리적인 동시성 및 일관성
  • 단점: 논리적 오류 발생 가능
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

Repeatable Read

트랜잭션이 시작된 시점의 데이터만 읽을 수 있습니다. 반복 가능 리드를 보장하지만, 팬텀 리드는 방지하지 못합니다.

  • 장점: 반복 가능 리드 보장
  • 단점: 팬텀 리드 발생 가능
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

Serializable

가장 높은 격리 수준으로, 트랜잭션이 직렬화된 것처럼 동작하여 모든 동시성 문제를 방지합니다.

  • 장점: 완벽한 일관성 보장
  • 단점: 낮은 동시성, 잠금 경합 발생 가능
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

 

 


 

트랜잭션 관리 최적화

효율적인 트랜잭션 관리는 데이터베이스 성능과 일관성을 유지하는 데 필수적입니다.

  • 짧은 트랜잭션 유지: 트랜잭션의 지속 시간을 최소화하여 잠금 경합을 줄입니다.
  • 적절한 트랜잭션 범위 설정: 필요한 최소한의 작업만 트랜잭션 내에서 수행합니다.
  • 오류 처리 및 롤백 구현: 트랜잭션 실패 시 적절한 롤백 로직을 구현하여 데이터 일관성을 유지합니다.
BEGIN;

-- 여러 연산 수행
UPDATE Accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE Accounts SET balance = balance + 100 WHERE user_id = 2;

-- 모든 연산이 성공하면 커밋
COMMIT;

-- 오류 발생 시 롤백
ROLLBACK;

 

동시성 문제 해결

 

동시성 문제는 데이터의 일관성과 무결성을 해칠 수 있으므로, 이를 효과적으로 해결하는 것이 중요합니다.

  • 데드락(Deadlock) 방지: 트랜잭션이 잠금을 기다리면서 서로를 블록하지 않도록 설계합니다.
  • 적절한 격리 수준 선택: 애플리케이션의 요구사항에 맞는 격리 수준을 선택하여 성능과 일관성 간의 균형을 맞춥니다.
  • MVCC 활용: 읽기와 쓰기 작업이 충돌하지 않도록 MVCC를 활용합니다.

 

실제 사례 분석

 

사례: 은행 계좌 간 자금 이체

두 개의 계좌 간 자금 이체는 트랜잭션의 원자성과 일관성을 보장해야 합니다.

BEGIN;

-- 출금 계좌에서 자금 차감
UPDATE Accounts SET balance = balance - 100 WHERE user_id = 1;

-- 입금 계좌에 자금 추가
UPDATE Accounts SET balance = balance + 100 WHERE user_id = 2;

-- 모든 연산이 성공하면 커밋
COMMIT;

 

해당 트랜잭션의 특징:

  • 원자성: 두 개의 업데이트가 모두 성공하거나, 하나라도 실패하면 전체 트랜잭션이 롤백됩니다.
  • 일관성: 트랜잭션 전후로 총 자산이 동일하게 유지됩니다.
  • 격리성: 다른 트랜잭션이 이 트랜잭션의 중간 상태를 볼 수 없습니다.
  • 내구성: 트랜잭션이 커밋되면 결과는 영구적으로 저장됩니다.

 

 


 

 

트랜잭션 관리와 동시성 제어는 데이터베이스의 일관성과 무결성을 유지하는 데 핵심적인 역할을 합니다. 백엔드 개발자는 ACID 특성을 이해하고, 적절한 트랜잭션 관리 메커니즘과 동시성 제어 기법을 적용함으로써 안정적이고 효율적인 데이터베이스 운영을 할 수 있습니다. 또한, 실행 계획 분석과 효율적인 조인 전략을 통해 쿼리 성능을 최적화함으로써 애플리케이션의 전반적인 성능을 향상시킬 수 있습니다.

 

 

 

 

 

참고 자료

https://www.postgresql.org/docs/current/tutorial-transactions.html

 

3.4. Transactions

3.4. Transactions # Transactions are a fundamental concept of all database systems. The essential point of a transaction is that it …

www.postgresql.org

 

https://learn.microsoft.com/en-us/sql/t-sql/language-elements/transactions-transact-sql?view=sql-server-ver16

 

Transactions (Transact-SQL) - SQL Server

Transactions (Transact-SQL)

learn.microsoft.com

 

https://www.mongodb.com/resources/basics/databases/acid-transactions

 

ACID Properties In DBMS Explained | MongoDB

ACID properties in DBMS make up the key aspects of an ACID transaction. In this article, we will explain the importance of atomicity, consistency, isolation, and durability.

www.mongodb.com

 

https://www.geeksforgeeks.org/acid-properties-in-dbms/

 

ACID Properties in DBMS - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

https://medium.com/inspiredbrilliance/what-are-database-locks-1aff9117c290

 

Locking in Databases and Isolation Mechanisms

A peek into the world of database locks, their types, and issues associated

medium.com

 

https://www.geeksforgeeks.org/best-practices-for-sql-query-optimizations/

 

Best Practices For SQL Query Optimizations - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

 

728x90
반응형