해결된 질문
작성
·
209
0
안녕하십니까
수업을 들으면서 궁금한 점이 있어 질문을 하게 되었습니다.
저희가 DB를 구축하게 되면 수많은 client들이 DB에 접근하게 될텐데 DB는 그러면 어떤식으로 작동하게 되나요?
질문 1 : A라는 Transaction이 수행도중에 다른 client 가 접근하여 B라는 행위를 하려고 하면 A라는 작업이 끝날때 까지 B 작업을 멈추고 대기를 하고 있는 건가요?
질문 1-1 : 만약 멈춘다면 프로그램이 커질 수록 해당 작업 시간이 많이 느려지는 데 어떻게 처리해야 할까요?
질문 1-2: 만약 멈추지 않는다면 작업 A가 작업 B에 영향을 주는 작업이라면 큰 문제가 되지 않을까요? (예를 들어 송금 문제 같은)
좋은 강의 감사합니다. 다음 설계 강의도 잘 듣겠습니다.
앞으로도 많은 강의 부탁드립니다.
답변 2
3
늘 궁금해하고 저도 궁금해했던 문제입니다. 트랜잭선은 정확하게 쿼리에서 말하는 트랜잭션이란 것을 가정하고 말씀드리겠습니다. 일단 트랜잭션이 시작되면 데이터베이스는 해당 테이블 또는 컬럼을 lock(잠금)을 통해서 보호합니다. 그리고 그 트랜잭션이 완료될때까지 모든 쿼리를 거부하고 미루어놓음으로써 내가 하는 연산이 정확하게 끝나는 것을 보장합니다. 따라서 트랜잭션은 정말 짧은 시간내에 처리하고 마칠 수 있도록 설계하는 것이 제일 중요합니다.
제 경험입니다만, 수백명이 모여서 스캔업무를 하는 공정관리 프로그램을 개발했었죠. 그럼 내가 이미지 보정을 해야 할 건을 할당받기 위해서 모든 사람이 "새작업"이라는 버튼을 누릅니다. 그럼 데이터베이스에서 그 사람에게 할당될 일을 찾아서 할당해주는 그런 부분이었죠. 놀랍게도 수천분의 1초까지 프로그램에서 제어를 하면서 먼저 온 요청을 처리할라고 하였으나 도처에서 아우성이 일어났죠. 우리 세 사람이 같은 건을 할당 받아서 같은 문서를 작업하고 있어요 !!! 진짜 죽을 만큼 그 시절에는 힘들었습니다. 여기서 트랜잭션과 테이블 Lock이 등장합니다. 데이터베이스 서버가 Lock을 걸어서 다른 사람의 참견을 미루어놓고 제일 먼저 들어온 건을 확실하게 처리해주는 기법이 제공되는 것이였죠. 그 뒤로는 어떤 누구도 중첩된 건을 할당받지 않았습니다.
김진현님이 질문하진 질문1은 멈추고 대기를 하는 것이 맞습니다. 그러나 효율을 위해서 제가 알기에는 뒤에서는 다른 것들을 처리할때까지 처리한다고 들었습니다. 그러나 정말 중요한 부분은 잠시 대기하는 것이 맞습니다.
따라서 다음 질문을 보면 제가 트랜젝션을 처리하면서 1분이 걸린다면 다른 사람들은 시스템이 다운되었는지 의심할 만큼 1분을 기다려야 합니다. 그래서 트랜잭션을 그런 식으로 개발하지는 않습니다. 즉, 0.001초 정도에 마칠 수 있도록 짧게 쿼리를 만들고 가장 간단한 부분에서 모든 것을 처리하도록 만들죠.
그래서 송금이던 어떤 문제이던 정말 짧은 처리로 순서를 정해야 하는 부분만 처리하게 하고 나머지는 편안하게 진행해도 되는 것들을 쿼리로 만들어 실행하게 됩니다.
이 부분에서 트랜젝션은 IdbConnection을 구현하는 Connection.BeginTransaction()을 호출하면서 시작하는 것이고 Lock은 XLock을 호출해서 특정 테이블에 타인이 접근하는 것을 방지하는 것으로 기억합니다. 이정도 힌트로 찾아보시면 충분히 트랜잭션을 유용하게 사용하실 수 있다고 생각됩니다.
너무 오랜 시간이 걸려 죄송하게 생각하지만 다음 강의가 ADO.NET인데 조금씩 준비하고 있습니다. 저도 실전에서 ERP 시스템을 개발하고 있어서 시간이 안나는군요. 다만 그 강의에서 이런 고난이도 문제들을 모두 다루어볼라고 강의를 만들고 있습니다. 이정도로 답변이 되기를 바랍니다. 감사합니다.
0