DB
Transaction과 ACID
ruu++
2024. 5. 23. 14:50
최근 Spring Transaction 사용자 동시성 이슈를 처리하면서 Lock과 트랜잭션에 대한 개념 공부가 부족해 막혔습니다.
항상 자료를 찾아보았지만, Transaction 관련해서 쭉 정리하는 시간을 가져 보려고 합니다.
시작은 Transaction과 ACID부터 정리하겠습니다.
1. 트랜잭션
- 읽기 / 쓰기 / 삭제/ 수정 등등 논리적 기능을 수행하기 위해서
하나의 작업 단위로 묶은 것을 말합니다. - Commit과 Rollback을 반영하기 이전까지 처리한 SQL문을 묶은 것을 하나의 트랜잭션이라고 생각하면 됩니다.
MYSQL 예시
- MySql에서 작업단위 처리하기.
- MySql은 기본적인 Default 설정은 AutoCommit 입니다.
- 트랜잭션을 적용하려면
오토커밋을 해제하거나START Transaction을 사용합니다.
- Auto Commit 설정 해제 하기
-- 현재 AutoCommit 값 확인
SELECT @@AUTOCOMMIT;
-- AutoCommit 0이라면 오토커밋 해제 1이라면 오토 커밋
SET AUTOCOMMIT = 0;
- START Transaction으로 단위를 묶기
START TRANSACTION;
-- 여러가지 SQL 문 처리
-- commit and rollback
commit;
- 트랜잭션 예시
Commit 이전의 SQL문들을 하나의 트랜잭션이라고 합니다. DBMS에서는 이 트랜잭션의 개념은 ACID원칙을 지켜 만들어 졌습니다.
SELECT * FROM TEST;
INSERT INTO TEST VALUES(1, 'TEST1');
UPDATE SET TEST TEST_NAME = 'TEST_UPDATED' WHERE TEST_ID = 1;
COMMIT;
2. 데이터 베이스 Transaction의 4가지 요소 ACID
- 원자성(Atomicity)
- 하나의 트랜잭션은
모두 실행되거나모두 실행하지 않는다상태만 존재합니다.
하나의 트랜잭션에서 사용한 내부 SQL문이 모두 커밋하거나, 하나라도 실패한다면 모두 롤백됩니다.
- 일관성(Consistency)
- 데이터 베이스를 구성 할 때, 정해놓은 규칙(일관성)을 성공하고 난 이후에도 계속 유지 되어야 합니다.
데이터 일관성 과 DBMS의 일관성은 다른 개념입니다. 그래서 오해하는 분들도 많을 것이라고 생각하는데요.
쉽게 생각하면 숫자 타입인데 String으로 업데이트가 불가능해야 합니다!! DBMS는 이것을 보장하고 계속 유지합니다.
- 고립성(Isolation)
- 여러 사용자가 같은 테이블에 접근하여 쓰기 및 읽기 작업을 진행할 때, 각각의 트랜잭션이 서로 방해하거나 영향을 끼치지 않습니다.
- 개발할 때, 발생할 수 있는 동시성 이슈를 말합니다. DBMS에서는 lsolation Level을 통해서 해당 문제를 관리합니다. 내용이 많으므로 다음에 따로 작성하겠습니다.
간단하게 예시를 들자면, 게시판의 특정 게시글에 대한 조회수는 동시성 이슈가 발생할 수 있습니다. 여러 사용자가 접속하게 되면 여러개의 커넥션과 트랜잭션을 생성합니다. 이 때, 격리 수준을 고려해서 처리하지 않는다면 동시에 사용자가 50명이 몰려 50번의 업데이트 문의 동작으로 조회수가 50일 것으로 예측되지만, 20~30 건이 나오는 등 데이터 정합성에서 문제가 발생합니다. 이 것은 서로 트랜잭션에 영향을 끼쳤다는 것이라고 말할 수 있으며, 고립성을 위반했습니다. 즉, 개발자가 동시성 이슈 중 가장 신경 써야 하는 개념 중 하나입니다.
- 영속성(Durabillty)
- 커밋된 트랜잭션 결과는
영구적으로 저장되어야 합니다. - 시스템적인 문제가 생기더라도 데이터를 영구히 보존해야 합니다.
- 영속성은 DBMS에서 보장해주므로 개발자는 DBMS를 믿어야 합니다.
출처