-
2023 - 07 - 06 트랜젝션 (Transaction) ACID (원자성, 일관성, 격리성, 지속성), 락(Lock), 락킹 수준, 교착상태 (Deadlock), 트랜잭션의 격리 수준Today I Learned/TIL 07 2023. 7. 6. 13:12
트랜젝션
작업의 완전성을 보장해주기 위해 사용되는 개념. 특정 작업을 전부 처리하거나, 전부 실패하게 만들어서 데이터의 일관성을 보장해주는 기능이다. 트랜잭션(Transaction)을 사용하는 대표적인 이유는 작업의 단위를 하나의 쿼리에 종속하는 것이 아닌, 여러개의 작업(쿼리)을 묶어 하나의 작업 단위로 그룹화하여 처리하는 작업을 뜻한다.
대부분의 데이터베이스가 트랜잭션의 특징을 이용하고 있으며, MySQL뿐만 아니라 거의 모든 데이터베이스에서 트랜젝션의 개념을 활용한다.
트랜젝션의 4가지 특징
원자성(Atomicity) / 일관성 (Consistency) / 격리성 (Isolation) / 지속성 (Durability)
원자성(Atomicity)은 트랜잭션 내에서 실행되는 명령들을 하나의 묶음으로 처리하여, 내부에서 실행된 명령들이 전부 성공하거나, 아니면 모두 실패해야한다는 특징이다.
일관성(Consistency)은 트랜잭션 내부에서 처리되는 데이터의 일관성을 유지해야하는 특징이다. 만약 작업이 성공할 경우 아무런 문제가 발생하지 않고, 실패하더라도 작업을 진행하던 도중 실패한 상태로 데이터를 방치하지 않는 특징이다.
격리성(Isolation)은 트랜잭션의 경우 실행 전이나 실행 후의 데이터를 외부에서 참조할 수 있지만, 트랜잭션을 수행하는 중간 상태를 보거나 변경할 수 없도록 구성하는 특징이다. 격리성(Isolation)의 경우, MySQL에서는 사용중인 DB 오브젝트에 락(Lock)을 걸어 격리성을 구현하게 된다. 여기서 락(Lock)을 건 상태는 DB에 접속한 또다른 클라이언트가 해당하는 DB 오브젝트를 읽거나, 사용할 수 없도록 만든다는 개념이다.
지속성(Durability)은 트랜잭션을 성공적으로 수행하면 수정된 데이터를 시스템에 영구적으로 적용하는 특징이다. 트랜잭션의 중간 결과가 아니라 완성된 결과만 저장하여 데이터베이스에 이상이 생기더라도 자동 복구할 수 있는 특성을 가지고 있다. 어플리케이션이 트랜잭션을 완료한 이후, DB에 COMMIT을 요청하였지만 변경사항이 반영되기 전에 DB가 비정상 종료될 경우, DB가 재시작 될 때 트랜잭션의 변경 사항을 다시 반영하게 되는데, 이러한 특징을 지속성(Durability)이라고 한다.
락 (Lock)
트랜젝션의 동시성을 제어하기 위해 사용하는 기능. 해당하는 데이터를 점유하는 다른 트랜젝션의 접근을 막아, 동시성과 일관성의 균형을 맞추기 위해 사용한다.
하나의 데이터를 여러 사용자들이 동시에 변경하려고 할 때, 락이 존재하지 않다면, 한번에 여러번의 수정이 발생하게되고, 최종 수정된 결과값을 인지할 수 없게 되는 상황으로 인해 데이터베이스의 일관성이 깨지게 된다. 이런 상황을 방지하기 위해 데이터베이스에서는 락(Lock)이라는 기능을 지원하게 되었다.락의 종류 2개 1. 공유락 (또는 읽기락) shared Locks/read locks 다른 트랜젝션이 데이터를 읽는것만 허용하고 수정하는 것은 금지함. 공유락을 사용하는 트랜젝션이 모든 작업을 수행했다면 공유락은 해제됨. 2. 베타락 (또는 쓰기락) Exclusive locks/write locks 다른 트랜젝션이 데이터를 읽는것도 금지하고 수정하는것도 금지함. 트랜젝션이 데이터를 점유한 후 다른 트랜젝션이 해당 데이터에 접근할 수 없게 함.
락킹 수준 (Locking Level)
[글로벌 락(Global Locks) 또는 데이터베이스 락(Database Locks)] 데이터베이스의 모든 테이블에 락을 걸어, 현재 트랜잭션을 제외한 나머지 트랜잭션들이 모든 테이블을 사용할 수 없도록 만든다. 가장 높은 수준의 락을 가지고 있으며, 가장 큰 범위를 가지고 있다. [테이블 락(Table Locks)] 다른 사용자가 작업중인 테이블을 동시에 수정하지 못하도록 한다. [네임드 락(Named Locks)] 테이블이나 테이블의 행과같은 DB 오브젝트가 아닌, 특정한 문자열을 점유한다. [메타데이터 락(Metadata Locks)] 다른 사용자가 작업중인 테이블의 동일한 행 및 동일한 데이터베이스의 객체를 동시에 수정하지 못하도록 한다.
교착상태 (Dead lock)
트랜젝션의 격리 수준
`READ UNCOMMITTED` 커밋 되지 않은 읽기(Uncommitted Read)를 허용하는 격리 수준. 가장 낮은 수준의 격리수준이며, 락을 걸지 않아 동시성이 높지만 일관성이 쉽게 깨질 수 있다. `**READ COMMITTED**` 커밋 된 읽기(Committed Read)만을 허용하고, `SELECT` 문을 실행할 때 공유락을 건다. 다른 트랜잭션이 데이터를 수정하고 있는 중에는 데이터를 읽을 수 없어, 커밋되지 않은 읽기현상이 발생하지 않는다. **`REPEATABLE READ`** 읽기를 마치더라도 공유락을 풀지 않으며, 트랜잭션이 완전히 종료될 때 까지 락을 유지한다. 공유락이 걸린 상태에서 데이터를 수정하는 것은 불가능하지만, 데이터를 삽입하는 것이 가능해진다. 그로인해 팬텀 읽기가 발생할 수 있는 문제점이 있다. `**SERIALIZABLE**` 데이터를 읽는 동안 다른 트랜잭션이 해당 데이터를 읽거나 삽입할 수 없고, 새로운 데이터를 추가하는 것 또한 불가능하다. 가장 높은 수준의 격리 수준이므로, 동시성이 떨어지는 문제점이 있다. 커밋되지 않은 읽기(Uncommitted Read) 다른 트랜잭션에 의해 작업중인 데이터를 읽게 되는 것을 나타낸다. 만약 커밋되지 않은 읽기가 발생할 경우, 의도치 않은 데이터를 참조하게 되어 데이터의 일관성이 깨지게 되는 상황이 발생하게 된다. 팬텀 읽기(Phantom Read) 트랜잭션을 수행하던 중 다른 트랜잭션에 의해 삭제된 데이터를 팬텀행(Phantom Rows)이라고 한다. 여기서, 팬텀행에 해당하는 데이터를 읽는 것을 팬텀 읽기(Phantom Read)라고 한다.
MySQL 트랜젝션 쿼리문
-- 트랜잭션을 시작합니다. START TRANSACTION; -- 성공시 작업 내역을 DB에 반영합니다. COMMIT; -- 실패시 START TRANSACTION이 실행되기 전 상태로 작업 내역을 취소합니다. ROLLBACK;
아래와 같이 할 경우. rollback하면 commit하고나서 이후의 값은 사라짐. 따라서 SELECT * FROM SPARTA; 하게되면 'SPARTA3' 까지만 저장됨 -- SPARTA 테이블을 생성합니다. CREATE TABLE IF NOT EXISTS SPARTA ( spartaId INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, spartaName VARCHAR(255) NOT NULL, spartaAddress VARCHAR(255) NOT NULL ); -- 1번째 트랜잭션을 실행합니다. START TRANSACTION; -- SPARTA 테이블에 더미 데이터 3개를 삽입합니다. INSERT INTO SPARTA (spartaName, spartaAddress) VALUES ('SPARTA1', 'SEOUL'), ('SPARTA2', 'BUSAN'), ('SPARTA3', 'DAEGU'); -- 1번째 트랜잭션을 DB에 적용합니다. COMMIT; -- 2번째 트랜잭션을 실행합니다. START TRANSACTION; -- SPARTA 테이블에 더미 데이터 3개를 삽입합니다. INSERT INTO SPARTA (spartaName, spartaAddress) VALUES ('SPARTA4', 'SEOUL'), ('SPARTA5', 'BUSAN'), ('SPARTA6', 'DAEGU'); -- 2번째 트랜잭션을 롤백합니다. ROLLBACK;
https://teamsparta.notion.site/3-4-Sequelize-2d4aaae488414fbe89fc14990e0d7ca1
3.4 Sequelize 심화
Goal: RDBMS의 트랜잭션을 이해하고, Sequelize를 이용해 트랜잭션을 구현한다.
teamsparta.notion.site
트랜잭션 ODBC - ODBC API Reference
트랜잭션 ODBC
learn.microsoft.com
https://jerryjerryjerry.tistory.com/48
[SQL] Transaction(트랜잭션)
* 트랜잭션(Transaction) - 트랜잭션이란 '거래'라는 뜻으로 데이터베이스 내에서 하나의 그룹으로 처리되어야 하는 명령문들을 모아 놓은 논리적인 작업 단위이다. - 데이터베이스 응용 프로그램은
jerryjerryjerry.tistory.com
https://dev.mysql.com/doc/refman/8.0/en/commit.html
MySQL :: MySQL 8.0 Reference Manual :: 13.3.1 START TRANSACTION, COMMIT, and ROLLBACK Statements
MySQL 8.0 Reference Manual / ... / SQL Statements / Transactional and Locking Statements / START TRANSACTION, COMMIT, and ROLLBACK Statements 13.3.1 START TRANSACTION, COMMIT, and ROLLBACK Statements START TRANSACTION [transaction_characte
dev.mysql.com
'Today I Learned > TIL 07' 카테고리의 다른 글
2023 - 07 - 10 객체지향 설계 5가지 원칙 SOLID (0) 2023.07.08 2023 - 07 - 07 Json Web Token (JWT)의 장단점, 토큰과 DB 사용자 인증, 쿠키, 세션 (면접 단골질문) (0) 2023.07.07 2023 - 07 - 05 액세스 토큰 Access Token, 리프레쉬 토큰 Refresh Token (0) 2023.07.05 2023 - 07 - 04 TCP, UDP, 소켓(socket.io), 웹소켓, 패킷 (0) 2023.07.04 2023 - 07 - 03 코드 가독성을 위한 코드서식 관리도구 Prettier (0) 2023.07.04