KoreanFoodie's Study

SQL 기초 - 19. 트랜잭션 모드와 락 본문

Database

SQL 기초 - 19. 트랜잭션 모드와 락

GoldGiver 2021. 10. 25. 16:09

이 글은 '김상형의 SQL 정복'의 예제 코드를 설명하는 방식으로 SQL 쿼리 예제를 소개하고 있습니다.

 

SQL 기초 - 19. 트랜잭션 모드와 락

은행 시스템 같은 극도의 정밀성을 요구하는 작업의 경우, 속도보다 무결성이 더욱 중요할 수 있다.

트랜잭션은 DML 쿼리들을 모아 원자성(한꺼번에 실행되거나, 아니면 아예 실행되지 않거나), 일관성, 격리성, 영속성을 보장하는 명령의 묶음이다.

트랜잭션은 실행되면 먼저 임시 작업 영역에 데이터를 저장한 후, 커밋을 하면 실제 데이터베이스에 저장되는 식으로 작동하여 안전하다.

모드는 흔히 자동 커밋(Auto Commit)모드와 수동 커밋(Manual Commit Mode)가 있는데, SQL Server와 MariaDB는 자동, 오라클과 DB2는 수동이 디폴트이다.

자동의 경우 트랜잭션이 바로 반영되지만, 수동의 경우 DML 트랜잭션 이후 COMMIT을 해야 실제 DB에 반영된다는 차이가 있다.

자동 커밋 모드에서 트랜잭션을 쓰고 싶으면 다음과 같이 쓰면 된다.

BEGIN TRANSACTION [이름] [WITH MARK]
명령
{ COMMIT TRANSACTION | ROLLBACK TRANSACTION }

자동/수동 커밋 모드 변경

수동 커밋 모드와 락

수동 커밋 모드에서는, 세션 1에서 트랜잭션을 실행 했을때 해당 DB에 락이 걸린다. 즉, 커밋이나 롤백을 하기 전에는 다른 세션이 해당 트랜잭션이 돌아가고 있는 DB에 접근할 수 없다!

 

저장점

트랜잭션이 일단 시작되면 이후의 명령은 묶음이 되므로, 전체를 확정하거나 취소하는 방법밖에 없다. 다음과 같이 중간 세이브 지점을 설정할 수 있다.

UPDATE tCity SET popu = 1000 WHERE name = '서울';
SAVEPOINT p1000;
UPDATE tCity SET popu = 1100 WHERE name = '서울';
SAVEPOINT p1100;
UPDATE tCity SET popu = 1200 WHERE name = '서울';
SAVEPOINT p1200;
ROLLBACK TO SAVEPOINT p1100;

 

락 (동시성과 일관성)

동시성과 일관성을 지키기 위해 DB에 락을 건다. ANSI 표준은 다음 두 가지의 락을 정의한다.

1. 공유락 : 다른 트랜잭션이 쓰는 것을 금지하지만 읽는 것은 허용한다

2. 배타락 : 다른 트랜잭션이 쓰지 못할 뿐만 아니라 읽지도 못한다.

TM 락은 테이블락으로, 테이블에서 수행하는 동작에 대한 표식이다.
락끼리의 호환성 여부

 

격리수준 (Isolation Level)

격리 수준은 쿼리를 실행할 때 어떤 종류의 락을 얼마동안 걸 것인가를 지정하는 옵션이다.

각 격리 수준에 대해서는 필요하다면 더 검색해 보도록 하자.

 
Comments