DB 접근에 대해서
안녕하십니까
수업을 들으면서 궁금한 점이 있어 질문을 하게 되었습니다.
저희가 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
14
2
강의에 적용한 스크립트를 받아 볼수 있을까요?
0
27
2
실습소실행안되요
0
27
1
MySQL 실습
0
240
1
데이터베이스 설치 관련
0
1265
4
선생님 mssql 한줄실행 단축키는 없을까요?
0
4288
1
열의 데이터 형식 변경 문제 질문입니다.
0
347
1
join 관련 문의드려요.
0
240
1
MySQL 쓰는 분들은 당황하지 말고 이 글을 보십시오
1
361
0
MySQL쓰는 분들은 이렇게 하세요
1
338
0
해당 강의 뒤쪽 부분이 조금 잘린 것 같은데
0
317
1
강의 소리가 좀 작네요
0
257
0
트리거 부분은 MySQL에서는 어떻게 구현해야하나요?
0
294
0
select문과 select절 강의 영상 잘린 부분은 언제 올라오나요?
0
246
1
심지어 DELETE문에서는 강의해주신 내용처럼 해도 실행되지 않고, DELETE FROM뒤 바로 JOIN구문을 사용하여도 실행되지 않습니다. 이부분도 어디가 잘못된건지 잘 모르겠습니다.
0
365
2
UPDATE문 사용시 FROM부분을 제거하고, UPDATE뒤에 와야할 타게팅 테이블로 JOIN문을 쓴 후, SET으로 변화된부분을 명시해주었더니 성공적으로 UPDATE가 되었습니다. 이부분은 mssql과 mysql의 문법차인지 궁금합니다.
0
414
1
저는 mysql workbench에서 실습을 하고 있습니다. 강의해주신대로 기존의 JOIN을 사용한 SELECT문에서 SELECT절을 제거한 후, 그 부분에 UPDATE절을 추가하였는데 FROM에서 오류가 나는것 같습니다. 어떤 부분이 잘못된건지 잘 모르겠습니다.
0
466
1
SELECT INTO 문에 대해 질문이 있습니다.
0
343
1
UPDATE에서 질문이 있습니다.
0
283
2
성능상의 문제
0
323
2
select문과 select절 영상 뒤쪽이 짤렸습니다. ㅠ
0
296
1
INSERT문 질문입니다.
0
306
1
mysql에서 distinct가 2개의 컬럼명에도 적용이 됩니다!
1
7490
1
강의 중 MySQL에서 insert문 사용할 때, 모든 컬럼에 데이터를 추가해도 컬럼명을 생략하면 오류가 난다고 하셨습니다. 오류가 안납니다!
0
299
1





