💅 SQL 입문
지난 시간에는 JOIN을 통해 복수의 테이블에서 공통 열을 통해 테이블 정보를 살펴보는 내용에 대해서 알아보았다. 이번 시간에서는 TRANSACTION과 COMMIT, ROLLBACK 등 개념을 통해 테이터 처리 및 취소 여부에 대해 알아보는 시간을 가지자.
📨 TRANSACTION
트랜잭션이란 무엇일까? 검색해보니 '더 이상 쪼갤 수 없는 업무 처리의 최소 단위이다.'라고 나와 있다. 개념적으로 학습하기에는 쉽게 이해가 되지 않으므로 예시를 통해 알아보자.
예를 들어, A라는 사람이 B라는 사람에게 1,000원을 지급하고 B가 그 돈을 받은 경우, 이 거래 기록은 더 이상 작게 쪼갤 수가 없는 하나의 트랜잭션을 구성한다. 그러나 A는 돈을 지불했으나 B는 돈을 받지 못했다면 그 거래는 성립되지 않는다. 이처럼 A가 돈을 지불하는 행위와 B가 돈을 받는 행위는 별개로 분리될 수 없으며 이는 하나의 거래내역으로 처리되어야 하는 단일 거래이다. 이런 거래의 최소 단위를 트랜잭션이라고 한다.
use BaseballData;
SELECT *
FROM teamshalf;
-- TRAN을 명시하지 않으면, 자동으로 COMMIT이 진행된다.
INSERT INTO teamshalf VALUES(1981, 123, 456, 789, NULL, NULL, NULL, NULL, NULL, NULL);
위 예제와 같이 TRAN을 명시하지 않으면 일반적으로 INSERT INTO를 통해 데이터를 넣는 처리가 진행된다. 따라서 트랜잭션은 BEGIN TRAN이라는 키워드를 통해 질의를 해야 한다.
-- 성공/실패 여부에 따라 COMMIT (=COMMIT을 수동으로 하겟다.)
BEGIN TRAN;
INSERT INTO teamshalf VALUES(1980, 123, 456, 789, NULL, NULL, NULL, NULL, NULL, NULL);
ROLLBACK;
BEGIN TRAN;
INSERT INTO teamshalf VALUES(1980, 123, 456, 789, NULL, NULL, NULL, NULL, NULL, NULL);
COMMIT;
📨 COMMIT
그렇다면 커밋은 무엇일까? 커밋은 트랜잭션의 모든 작업들을 정상적으로 처리하겠다고 확정하는 명령어로서, 처리과정을 데이터베이스에 영구적으로 저장하는 것이다.
BEGIN TRAN;
INSERT INTO teamshalf VALUES(1980, 123, 456, 789, NULL, NULL, NULL, NULL, NULL, NULL);
COMMIT;
위와 사용할 수 있다.
📨 ROLLBACK
커밋이 위와 같으니 롤백은 이와 반대되는 동작을 처리하는 것을 유추할 수 있다. 롤백 연산은 작업 중 문제가 발생하여 트랜잭션의 처리과정에서 발생한 변경사항을 취소하는 명령어이다.
BEGIN TRAN;
INSERT INTO teamshalf VALUES(1980, 123, 456, 789, NULL, NULL, NULL, NULL, NULL, NULL);
ROLLBACK;
마찬가지로 위와 같이 사용할 수 있다.
📨 응용
SQL에서는 C#에서와 마찬가지로 try-catch문을 사용할 수 있다.
-- 응용
BEGIN TRY
BEGIN TRAN;
INSERT INTO teamshalf VALUES(1980, 123, 456, 789, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO teamshalf VALUES(1980, 123, 456, 789, NULL, NULL, NULL, NULL, NULL, NULL);
COMMIT;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 -- 현재 활성화된 트랜잭션 수를 반환한다.
ROLLBACK
END CATCH
위와 같이 BEGIN TRY-BEGIN CATCH 문을 통해 작업중에 오류가 발생할 경우 CATCH문이 동작하게끔 설정할 수 있다.
마지막으로 트랜잭션을 사용할 때 주의점이 있다. 바로 트랜잭션 내부에서 실행한 로직들은 꼭 원자적으로 실행할 수 있는 로직만 넣어서 사용하는 것이다.
무슨말이고자 하니 C#으로 예를 들어보자. 게임 서버 시간에 우리는 원자적으로 값을 실행해 줄 때 Lock을 통해서 값을 설정해주었다. 왜냐하면 다른 스레드가 접근하여 값을 수정할 수 있었기 때문이다. 트랜잭션도 마찬가지이다. 내가 어떤 작업을 Commit/Rollback 하지 않고 혹은 오랜 시간 작업이 걸리는 로직을 처리하면 다른 쿼리문에서 질의를 던질 때 작업 완료가 정상적으로 되지 않았기 때문에 트랜잭션의 로직이 끝날 때 까지 대기할 수 밖에 없기 때문이다.
'공부 > 인프런 - Rookiss' 카테고리의 다른 글
Part 5-2-19. SQL 입문 : 윈도우 함수, OVER/ROW_NUMBER/RANK/DENSE_RANK (0) | 2024.06.01 |
---|---|
Part 5-2-18. SQL 입문 : 변수와 흐름 제어, 배치/테이블 변수 (0) | 2024.05.30 |
Part 5-2-16. SQL 입문 : JOIN, CROSS/INNER/LEFT/RIGHT JOIN (0) | 2024.05.09 |
Part 5-2-15. SQL 입문 : UNION, INTERSECT, EXCEPT (1) | 2024.02.13 |
Part 5-2-14. SQL 입문 : INDEX (1) | 2024.02.13 |