본문 바로가기
개발/DBMS

Transaction - 트랜잭션

by EPdev 2020. 11. 13.
728x90

이번 글에서는 Transaction (이하 트랜잭션) 이라는 것에 대해 말해보겠다.

 

본인도 트랜잭션을 알게 된지는 그리 오래되지 않았다. 그리고 그 필요성도 딱히 느끼지 못 했었다.

따라서, 혼자 개발 공부할 때에는 트랜잭션을 사용하지 않았다.

 

하지만 회사 프로젝트에서는 대부분 트랜잭션을 사용하고 있었다. 그래서 트랜잭션을 좀 더 관심있게 보게 됐다.

사실, 회사에서 쓸 프로젝트에 본인이 Stored Procedure를 개발할 일이 있었는데 이 때 트랜잭션을 쓰지 않고 개발했다가

혼이 났다 ㅎㅎㅎ 그래서 실수를 다시 하지 않기 위해 기록을 남기겠다.

 

여기선,

트랜잭션이란 무엇이며

왜 그리고 언제 사용하는가? 에 대해 다뤄보겠다.

(트랜잭션의 역사나 유래나 이런 것은 잘 모른다. 이건 자료를 찾아봐야하는데.. 찾으면 다 나오는 것이니 지금은 몸소 깨달은 바를 적겠다.)

 

1. 트랜잭션이란 무엇인가?

트랜잭션이란 Query의 실행을 보장하기 위해서 사용한다.

여러 Query가 연속적으로 실행되는 와중에 문제가 생긴다면, 실행된 Query 까지만 DBMS에 반영되고, 그 이후론 반영되지 않는다.

(이 특성은 SQL이 interpreter language이기 때문.. SQL이 interpretered language인지 compiled language인지는 언어에 따라 다르지만 이는 더 찾아보자.)

 

어쨌든, 문제는 query가 실행되다가 오류가 생기면 이후의 query는 실행되지 못 한 채 끝나버린다. 문제가 있어보이지 않는가? 이게 왜 문제가 되는지는 다음 section에서 알아보고, 이를 방지하기 위한게 바로 트랜잭션이다 라는 것을 먼저 알아두자.

 

즉, query가 완전히 실행되는 것을 보장하기 위함이다.

트랜잭션이 이를 어떻게 보장하는가? 그것은 바로 여러 쿼리가 실행되는 와중에 에러가 발생하면, 현재 쿼리가 실행되기 이전에 이미 실행되었던 모든 쿼리들의 실행을 취소해준다. 이를 rollback 이라고 한다. (돌려서 돌아간다?) 그리곤 에러가 발생했다고 warning을 줄 것이다.

그러면, 뭐가 문제인지 확인하고 수정한 다음 쿼리들을 다시 실행되도록 할 수 있겠다.

 

2. 왜 그리고 언제 사용하는가?

2-1. 왜라는 질문에 대해서는 위에서 다 설명한 것 같다. 쿼리들의 실행을 보장하기 위함.

그럼 여기선 예를 들어보겠다.

DB tables을 정규화에 의해 나누다 보면 테이블이 아주 잘개잘개 조개진다. (정규화가 뭔지 모르겠다면 이전 글을 참고하자.)

 

테이블이 잘개잘개 조개진다는 것은, 하나의 data를 바꿀 때 그만큼 수정해줘야하는 table도 많다는 것.

그럼 이 모든 table을 수정해주기 위해 여러 쿼리를 실행해야한다는 것.

 

예를 들어, 게시글을 삭제한다고 생각해보자.

먼저 게시글을 위해서 테이블을 다음과 같이 만들었다고 가정하자. 뭐 어떻게 테이블을 짜느냐는 방법이 많겠지만, 일단 가정해보자.

articles - 게시글에 대한 데이터

comments - 댓글에 대한 데이터

attachments - 게시글에 들어간 첨부파일 목록

 

이 상황에서 하나의 게시글을 삭제한다면, 게시글에 들어간 첨부파일 다 삭제하고, 목록 삭제하고, 댓글 삭제하고, 게시글 삭제해야한다.

자 이것만 해도 쿼리가 몇 개인가?

그런데 댓글을 삭제하는 와중에 무슨 원인이든 에러가 발생했다. 그럼 게시글은 살아있고 댓글과 첨부파일은 다 날아간 상황이다.

게시글은 삭제되지 않았으니 유저는 게시글 목록에서 이 게시글을 볼 수 있겠다. (댓글과 첨부파일이 다 삭제된 상태로...)

게시글은 뭐 중간에 에러 때문에 데이터가 이상하게 되더라도 문제가 크게 안 될수도 있다.

하지만 계약이나 은행 같은 중요한 정보를 다루는데 중간에 에러가 발생해서 이상한 데이터가 남아있다?

(고소 당하고 배상해주면 된다.)

 

이런 문제가 있을 수 있기 때문에, 쿼리의 완전 실행을 위해 트랜잭션을 사용하는 것이다.

 

2-2.언제 사용하는가에 대해서 더 살펴보자.

쉽게 말하면 DB table의 data에 변화를 주는데, 한번에 여러 쿼리를 실행할 때 사용한다.

이말인 즉슨,

a. SELECT문에서 트랜잭션을 사용할 필요가 없다는 것.

b. SELECT문이 아닌 다른 DML은 여러 개를 한번에 실행할 때 트랜잭션을 사용한다는 것.

왜냐하면, SELECT문은 data에 변화를 주는게 아니다. 바뀌는게 없으니 에러가 발생해도 data 차원에선 문제가 없다.

또, DELETE, UPDATE, INSERT같은 DML을 하나만 실행할 때도 문제가 되지 않는다.

하나만 실행하는데 중간에 에러가 발생하면, 에러가 난 것을 수정하고 다시 실행하게 하면 된다.

 

여러 CUD(Create/Update/Delete) 쿼리를 실행하는데 중간에 에러가 난다면 어디서 어떤 에러가 났는지 추적하기도.. 어디서부터 수정해서 실행해야하는지도.. SQL 까지 보지 않는 이상 어렵다.

 

어쨌든!!!

이러한 이유로, 트랜잭션은

CUD를 여러 개 묶어서 실행할 때, 처음에 트랜잭션을 시작하겠다! 고 선언하고 중간중간에 에러 체크를 넣어주며, 에러가 있다면 rollback and return 한다. 모든 쿼리가 끝나면 마지막에 트랜잭션이 끝났다! 고 알려주면 된다.

 

뭔가 장황한데, 결국엔 트랜잭션이란 무엇인지 알고

CUD DML을 여러개 쓸때 사용해야한다는 것만 알면! 될거 같다.

728x90

'개발 > DBMS' 카테고리의 다른 글

JOIN 문제 해결  (0) 2020.11.11
문자+숫자 DB 컬럼 정렬하기  (0) 2020.11.09
JOIN 문제  (0) 2020.11.05
RDBMS 정규화(Normalization) - 2/2  (0) 2020.09.27
RDBMS 정규화(Normalization) - 1/2  (2) 2020.09.24

댓글