트랜잭션

fcitx 5 까는김에 mozc도 같이 깔은 건 좋은데… 언어 변환이 안돼…

한-영은 되는데 일어가 안됨 ㅋㅋㅋㅋㅋ

Focuswriter때문에 세팅한건데 문제는 이거 해도 거기서 될지 모릅니다…


트랜잭션은 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위를 뜻한다. …예?

그 왜 예전에 CRUD 설명하면서 프로그램에 이거 없으면 안된다! 이렇게 얘기를 했는데… 아시죠? Create, Read, Update, Delete. 얘네가 묶어서 크루드인데 데이터베이스에 접근해 뭘 수정할 때는 이 과정을 거치게 된다. 예? 저는 그런거 한 적 없는데요? 아니 당신이 댓글 올리기 버튼 누르면 데이터베이스에 접근해서 댓글을 달고 불러오잖음.

그럼 예를 들어보자. 네이버 블로그에 허구헌날 들러붙는 벌레들은 안부게시판에 돈줄테니 글써주세요~ 를 장황하게 설명한 글을 올린다. 그러면 안부게시판에 글을 올릴거니까 데이터베이스에 접근해서 글을 추가하고, 새로 페이지를 로딩해서 그 글을 보여주면 나한테 알림이 가겠지? 이게 글을 올리는 데 필요한 트랜잭션이다. 그리고 그 알림을 본 내가 단전 깊은 곳에서 느껴지는 분노를 담아 신고를 하면 내 스팸 차단 아이디 데이터베이스에 작성자 아이디가 추가되고, 새로 갱신되겠지? 그게 아니면 키워드를 내가 추가해서 키워드 데이터베이스가 바뀌지 않겠는가. 우리는 모르고 있지만 이 과정은 데이터베이스에 접근해서 SQL을 이용한 ‘질의’를 통해 이루어진다.

더 간단한 예시가 있다. 깃헙에 뭘 올리고 올렸다 끝! 하려면 풀-커밋-푸시를 해야 한다. 그니까 풀로 땡겨서 바뀐거 없나 보고(맞나?)->커밋으로 이거 바꿀거다+코멘트를 하고->푸시로 최종적으로 올려야 비로소 깃헙에 올렸습니다 하잖음.


트랜잭션에는 조건이 있는데… 뭐 유기체냐… 아무튼 있다.

원자성

트랜잭션이 데이터베이스에 모두 반영되던가, 아니면 전혀 반영되지 않아야 한다는 것. 예를 들어보자. 엄마 생신인데 자꾸 돈으로 주면 반찬이 바뀌니까 아예 동생놈하고 작당해서 건강식품을 사 주기로 했다. 그래서 이 아조시가 공진단을 사기로 했는데 가격을 5:5로 더치페이 하기로 한 것이다. 그래서 20만원을 보내주기로 했다 치자.

송금의 트랜잭션은 간단하게 두 가지인데 첫번째는 보내는 사람 계좌에서 보내는 돈만큼을 빼는거고, 두번째는 받는 사람 계좌에 그 보내는 돈만큼을 더하는 것이다. 그러니까 내가 20만원을 동생놈 계좌로 보내면 동생놈 계좌에는 20만원이 추가되고, 내 계좌에서는 20만원이 빠지게 되는거지.

근데 송금하려고 했더니 은행 앱이 점검시간이라 송금이 안되는거다. 그러면 내 계좌에서는 돈이 안 빠져나가고, 동생놈 계좌에는 돈이 안 들어간다. 돈을 보낼 수 없는 상황이라 송금 자체가 안 되고, 송금 트랜잭션 자체가 실행이 안되는 것. 모두 반영되거나(송금 성공시) 아니면 전혀 반영되지 않아야 한다(송금 취소 혹은 실패시)는 건 이런 의미다.

일관성

트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다는 것. 엑셀은 동시편집이 안되지만 데이터베이스는 동시편집이 된다. 막말로 지금 이 시간에 나 혼자 송금하는 거 아니잖음. 지금 이 시간에 쇼핑 나 혼자 하는 거 아니고 카드도 나 혼자 긁지 아니한다. 그러면 예를 들어보자. 나는 닌텐도 스위치 온라인 패밀리플랜의 패밀리 리더인데, 올해도 패밀리원들이 연장을 하게 돼서 내가 돈을 내고 각 패밀리원들에게 일정 금액을 받았다. 근데 이 사람들이 순차적으로 보내진 않을거란말이지.

그럼 여기서 생각해보자. 나도 토스뱅크 계좌번호가 있을 거 아님? 아 갈아탔음 국민은행에서… 아무튼. 그런데 A라는 사람이 나한테 송금했더니 계좌번호가 바뀌면 어떻게 되겠어요. 아니면 A라는 사람이 나한테 송금했더니 예금주 이름이 바꼈어. 아니면 A라는 사람이 나한테 5000원을 송금했는데 내 계좌 총합이 4000원밖에 안올랐어. 이러면 안된단말이죠. 여기서 고정 요소를 내 토스뱅크 계좌번호와 예금주 이름이라고 하면, 어떤 사람이 송금을 하던 이 두 가지는 절대 변하지 않는다.

그런것처럼 트랜잭션 하나가 끝났을 때도 데이터베이스는 일관성 있는 상태로 변환해야 한다는 얘기다.

독립성

어떤 하나의 트랜잭션이라도, 다른 트랜잭션의 연산에 끼어들 수 없다. 즉, 모든 트랜잭션은 독립적으로 실행되어야 한다.

자 봐봐요 내가 포고 렙 48인데… 포켓몬은 보통 포켓몬고 플러스 플러스(최근 샀음)가 잡아주지만 얘가 못 잡는 경우도 있다. 루브도나 리서치 보상(대발견 포함), 그 외에 서프라이즈 샷으로 나오는 포켓몬이나 레이드 이후 잡는 포켓몬은 손으로 잡아야 한다. 내일부터 종이신도라 또 불태우러 가야 함… 아무튼 종이신도 레이드를 마치고 볼을 던지는 상황을 가정해보자. 그 상황에서도 내 주변에는 포켓몬들이 많이 소환될거고, 플플 안에 든 노랑뚱땡이는 그 포켓몬들을 알아서 잡고 있을 것이다. 그동안 내가 종이신도 레이드에서 딜을 하거나 종이신도에게 볼을 던지는 데에는 아무런 영향도 안 주기때문에 나는 레이드를 뛰면서 포켓몬을 잡을 수 있는 것이다.

다른 예시를 들어보자. 종이신도 레이드를 해외 친구들이랑 하려고 초대를 하기로 했는데, 초대를 하려면 먼저 친구추가가 되어있어야 한다. 그러면 미국 사는 토마스도 나한테 친구신청을 할 거고, 일본 사는 다나카도 나한테 친구신청을 하고, 캐나다 사는 캐빈도 나한테 친구 신청을 할 것이다. 이 때 토마스의 친구 신청이 도착하는 과정에서 다나카나 캐빈의 친구신청에 문제가 생기면 안 된다. 이놈들 서버때문에 좀 늦게 오긴 한데 아무튼 이 경우 3건이 친구 신청이 제대로 와야 한다.

영속성

트랜잭션이 성공적으로 완료됐을 경우, 결과는 영구적으로 반영되어야 한다. 물론 트랜잭션 하는 중간에 서버가 서버(였던것) 되거나 벼락쳐서 컴퓨터가 꺼지거나 하면 그건 빠이짜이찌엔이지만, 한 번 완료되고 반영된 것에 대해서는 영구적으로 반영이 된 상태여야 한다.

그 예전에 카카오 데이터센터 불났던거 기억하죠들? 샹델라 커뮤 도는데 챗방이 잠잠해서 봤더니 카카오가 불타고 있었는데… 그렇게 오래 탈 줄 몰랐고… 아니 UPS는 장식이 아닙니다 카카오놈들아… 아무튼. UPS가 뭐냐면 정전되거나 번개맞고 전기가 나갔을 때 사용할 수 있는 긴급전원같은 거다. 이것도 영구적으로 콘센트 대용으로 쓰는 건 아니고 대처할 동안 시간을 벌어주는건데… 아무튼 그때 카카오톡 전송은 안 됐지만 불나기 전에 주고받았던 톡들은 그대로 있었잖음? 뭐 플친 톡이라던가…

포켓몬고에서 어쨌든 내가 잡은 포켓몬은 내가 박사에게 보내기 전까지는 내 포켓몬 박스에 있다. 나이안틱 서버가 나가거나 내 핸드폰이 고장나도 말이지.


트랜잭션에도 연산이 있는데, 커밋과 롤백이다. 커밋은 쉽게 얘기하자면 네이버페이의 ‘다썼다 혜택뽑자’ 정도 되시겠다. 정확히는 트랜잭션이 끝났고 DB 갱신도 끝났다는 것을 관리자에게 알려주는 연산이 커밋이다. 롤백은 반대로 아 씁 이거 연산 뻑났다 다 취소! 이게 롤백. 보통 이 단어를 어디에 쓰는가를 생각하면 쉽게 이해할 수 있다.