개발 Q&A

제목 테이블 동시 변경 관련 문의드립니다.
글쓴이 작성시각 2015/12/02 17:49:08
댓글 : 3 추천 : 0 스크랩 : 0 조회수 : 12709   RSS
안녕하세요. 
디비 엔진은 innodb를 사용하고 

rb_no | int(10) | unsigned | NOT NULL | pk, auto_increment 
rb_date | date | NOT NULL | 날짜 
rb_use | tinyint(1)  | NULL | 마감 
rb_block_cnt | tinyint(10) | unsigned | NOT NULL | 날짜에블럭수 
rb_use_cnt | tinyint(10) | unsigned | NULL | 사용블럭수 
rb_rm_no | int(10) | unsigned | NOT NULL | 객실번호 

이런 테이블인데요. 

날짜에 블럭수와 사용블럭수에 관련된 내용이에요. 

사용한블럭수는 날짜에 블럭수보다 적거나 같은 관계인데요 

날짜에 블럭수를 변경할시에 적거나 같은지 검증하는 로직을 짜서 업데이트를 하고 있습니다. 

문제는 사용한 블럭수가 한개 더해져서 업데이트 되는 쿼리랑 날짜에 블럭수가 변경되는 쿼리가 

동시에 발생했을 시에 문제가 될 거같은데, 여러분은 어떻게 하시나요??

제가 생각하는 몇가지 대안은...

1. 날짜에블럭수를 변경할때엔 기간에 대해서 트랜젝션으로 묶어서 업데이트를 하는데
업데이트를 한 후에 트랜젝션이 끝나기 전 한번 더 적거나 같은지 검증해서 트랜젝션이 실패하도록 한다

2. 디비 트리거를 이용한다.. ( 디비 트리거 한번도 사용 안해봐서 이럴때 쓰는건지는 모르겠는데
설명보니깐 이런경우에 사용하는거 같은데... )


 
 다음글 70만개의 데이타가 있는 XML를 파싱해서 DB에 넣을... (6)
 이전글 sqlsrv 오류입니다. ㅠㅠ (3)

댓글

/ 2015/12/03 09:07:08 / 추천 0
업데이트 시에 조건절에 추가해서 업데이트 시 검증을 하도록 했습니다.
근대 디버그모드를 켜고 업데이트 쿼리를 날리고,
sqlyog에서 업데이트문을 실행했는데 업데이트가 안되네요?
이거 원래, 락이 걸리는건가요??
 
kaido / 2015/12/03 09:41:33 / 추천 0
정확한 상황은 봐야 알겠지만... 

기본적으로 한가지 테이블에 업데이트는 동시 진행이 안 되는 것으로 되어 있습니다.

트랜잭션은 모든 실행이 성공이냐 실패냐로 구분 되며, 트랜잭션이 시작되면 기본적으로 락이 걸립니다.


쉬운 방법은 트리거긴 합니다.
트리거는 퍼포먼스 측면에서도 좋습니다. 
[개인적으로는 트리거를 최대한 안 다는 것을 좋아합니다.]
업데이트를 하고 업데이트 형태면 확실히 트리거가 가장 빠른 길입니다.

 
/ 2015/12/04 09:40:58 / 추천 0
//kaido
답변 감사합니다.
찾다보니 for update라는 구문이있어서 적용해보려고 합니다.
근대 적용법을 모르겟네요 ㅠㅠ