개발 Q&A

제목 만개의 데이터, 만개의 업데이트?
글쓴이 milosz 작성시각 2012/10/02 10:06:44
댓글 : 8 추천 : 0 스크랩 : 0 조회수 : 21534   RSS
 이런 작업을 별로 해본적이 없어서 ㅠㅠ 디비 관련 질문입니다.

이런 상황에서 전체 데이터를 업데이트 하는 쿼리를 사용하면 서로 충돌이나 지연이 발생할 여지가 있나요?
 
질문이 상당히 모호한데... 전체를 업데이트하는 쿼리가 cron으로 일정 간격을 두고 돌아가는 상태에서

만약 그 업데이트쿼리가 돌고 있는 순간에 다른 업데이트 쿼리가 실행되거나 하게 되면 서로 충돌되어

문제가 생긴다거나 할 수도 있을까요?

쿼리를 잘 작성하고 트랜젝션을 잘 배치하면 아무 문제 없다고

이론적으로는 알고 있지만 실제 적용하려니 뭔가 모호하네요..;;
 다음글 URI Routing 관련하여 질문 드립니다. (6)
 이전글 ExpressionEngine 사용하면 개발이 더 편할... (2)

댓글

지지고 / 2012/10/02 10:16:47 / 추천 0
혹시 재고 수량갱신 같은 작업을 하시나요?? 

아니면... mongodb 처럼 db에 락이 안걸린 상태로 작업하시나요??

초짜라 전체업데이트가 필요한 상황이 어떤 것인지 감을 못잡겠네요. 궁금합니다.
milosz / 2012/10/02 14:56:48 / 추천 0
 음.. 이 상황에.. 예를 들자면;;
 
농업기술연구소에서 1만 그루의 나무를 심었고 이를 DB화 해서 관리합니다.
 
저장되는 데이터는 나무 고유번호와 나무의 기럭지(mm) 두가지인데 기본적으로 분당 0.1mm씩 성장합니다.
 
하지만 전체가 항상 분당 0.1mm씩 증가한다는 사실을 보장할 수 없기 때문에 열명의 연구원이 하루에 열그루씩 실제로 기럭지를 측정해 데이터를 갱신하고 있습니다.
 
그런데 이 연구가 인류의 생존과 관련됨에 따라(...) 매일 연구원을 추가채용해 연구원 수가 늘어가고 있습니다.

만약 이런 환경이라면 전체 업데이트와 각 개별 연구원의 업데이트가 서로 영향을 미치게 되진 않을까 해서 말이죠.. 적고나니 트랜젝션을 적절하게 하면 데드락 같은거는 전혀 걸릴 거 같지 않긴 한데...
지지고 / 2012/10/02 19:43:57 / 추천 0
데드락에 관해서는... 큐브리드에서 각 트랜젝션에 잠금시간을 설정해주는 옵션을 쓰면 된다고 하네요.
만약 세 개의 트랜젝션이 데드락 상태면.. 각 트랜잭션에 걸린 잠금시간이 가장 작은 것부터 트랜젝션이 롤백된다고 합니다.

트랜젝션1: 3초,
트랜잭션2: 3분,
트랜젝션3: 1초.

이 세 트랜젝션이 데드락 상태면... 잠금허용시간 설정에 따라서
가장 짧은 잠금허용시간을 가진 트렌잭션 3이 먼저 롤백,
그다음으로 짧은 허용시간 가진 트랜젝션 1이 롤백,
가장 긴 허용시간을 가진 트랜젝션 2가 롤백,

결과적으로는 데드락이 걸리면 그상태로 쭈~~욱 가지 않고 DB에서 허용시간에 따라서 모두를 롤백시킨다는 말 같습니다. innoDB 에서는 타임아웃이라는 이름으로 사용되는 것 같아요.

근데 이게 코드 이그나이터 트랜젝션 클래스에서도 적용되는지는 ... ;;

MySQL Korean 에 데드락 대처방법에 따르면

 최대한 테이블 락 기능을 사용하지 않도록 이것저것 설정해라...
  락기능을 수행해야 한다면 가장 최소단위로 락을 설정해라...
 열단위로, 순차적으로 트랜젝션이 일어나게 해라...
  데드락은 언제든 일어나니 롤백됐을 때 그냥 다시 시도하는 기능을 만들어라..

이렇게 제시하는 것 같아요. 데드락이란 말을 처음 들어서 공부하게 되네요.

milosz / 2012/10/03 08:15:46 / 추천 0
 검색해보니 데드락은 피할 수 없는 숙명이네요.
 
1) 애초에 안생기게 하던가
2) 데드락 걸리면 다시 실행하게 하던가
 
2번의 경우는 1213 에러를 내면 데드락인걸 판단해서 다시 쿼리를 쏘는 형태로 작성하면 된다는데... 이것도 좀 모호하게 데드락인지 단순 처리지연인지에 따라 롤백 여부도 달라진다고 하네요.
 
데드락을 절대 발생시키지 않는 방법은 쿼리 할 때마다 테이블 전체를 락 걸면 되는데 성능 저하는 어쩔 수 없다는 식이고...
 
답변 감사합니다. ^^
sliplife / 2012/10/10 16:23:44 / 추천 0
 설마 1만개의 데이터 업데이트를 일일히 sql query 문으로 하는건 아니겠지요?
대량 데이터를 파일을 이용해서 한번에 업데이트 하는 방법이 있습니다. in data 인가 뭔가 하는데 정확한 단어는 가물거리구요.
그리고 보통은 이런 작업은 접속량이 적은 새벽시간대를 이용하여 하루에 한번씩 한다던지 하는식으로 이뤄지는게 일반적인데 그렇지 않고 굉장히 빈번하게 일어나는것이라면 기획부터 다시 고민해보시는게 좋을거 같습니다.

그리고 1만개 정도는 대형 시스템 기준으로는 말그대로 껌이니 크게 걱정 안하셔도 됩니다.
milosz / 2012/10/11 07:35:40 / 추천 0
 웹게임 개발 의뢰가 들어와서요.. 특성치가 분당 변동되는 형태라 어쩔수 없이 전체 데이터에 대한 업데이트가 있어야 하는데 일일이 쿼리는 아니고 update `something` set `length` = `length`+ 1; 식으로 전체 업데이트를 해야 한다고 기획이 나왔습니다.

그렇다면 이건 게임서버를 두고 메모리에 올려두고 처리를 해야하는 걸까요? 이런류의 의뢰도 처음이고 의뢰자도 처음이라 멍하네요ㅠㅠ
변종원(웅파) / 2012/10/11 10:21:55 / 추천 0
1분 동안의 게임의 결과를 게임의 특성치에 반영하는 것이라면 재고해보는 것이 좋을 것 같네요.

기술적으로 풀 수 있는 것은 한계가 있습니다. 시간을 조절하여 처리하는 것이 좋을 것 같습니다.

업데이트 서버와 셀렉트 서버를 분리하여 부하를 줄일 수는 있겠지만 어쨌든 1분 마다 그정도 업데이트라면..

1. 업데이트 하기전에 내용을 파일db로 만든다. (게임에서는 파일db만을 참고한다.)
2. 업데이트를 한다.
3. 이 과정을 반복.

게임에서 참고하는 데이터는 결국 2분전 데이터이기는 하지만 그나마 안정적으로 사용할 수 있을 것 같습니다.

파일db명을 파일명_201210111023.db 식으로 만들어서 해당 시간에 해당 파일을 참고하게 하고
없다면 -1분 전 파일을 참고하게 하면 좀더 보완을 할 수 있습니다.

milosz / 2012/10/11 11:49:52 / 추천 0
 값은 실시간으로 필요한 부분이라서요. 아무래도 시간값을 넣고 보간법으로 계산하는 방식으로 가야겠네요... 로직이 복잡해질 것 같아서 전체 업데이트로 가자고 했는데...
답변주신 분들께 감사드립니다!