동시성 문제라.. 쉽지 않은 문제이지요. Access의 경우, 다음과 같은 화면을 간혹 볼 때가 있습니다.
이 때는 어떻게 해야 할까요?
- 레코드 저장: 그냥 내가 편집한 내용으로 강제로 저장합니다. 최신 데이터가 아닐 위험이 있습니다.
- 클립보드로 복사: 내가 편집한 내용을 복사해 놓고, 최신 데이터로 갱신합니다. 가장 좋은 방법입니다.
- 변경내용 취소: 내가 편집한 내용을 취소하고 최신 데이터로 갱신합니다.
동시성 문제는, 복잡하게 생각하지 말고, 간단하게 생각해야 합니다.
어떤 책이 있습니다. 여러 사람이 동시에 편집할 수 있도록 개방된 책이죠. 이 책을 기록하는데 한 사람이 책을 편집중이면 책을 통째로 고치지 못하게 정책을 세울 수 있겠죠.(엑셀) 조금 더 편하게 하려면 어떤 페이지를 편집중이면 그 페이지를 고치지 못하게 정책을 세울 수 있겠습니다.(액세스) 이렇게 생각하시면 이해하기가 쉽죠.
우리가 엑셀을 사용하면, 엑셀은 파일 단위로 '락'을 걸어버립니다. 한 사람이 편집중이면, 다른 사람은 그 파일을 통째로 편집 불가능하게 하는 것이죠. 그래서 매우 불편합니다. 사람들이 액세스를 찾게 되는 중요한 원인 중 하나죠.
액세스는 그 '락' 단위를 레코드(행)로 줄인 것입니다. 그래서 동시 편집이 불가능한 경우가 대폭 줄어드는 것입니다.
이 '락'이라는 것은, 컴퓨터 입장에서 볼 때는 크게 의미가 없습니다. '메모장' 프로그램을 생각해 보세요. '메모장'프로그램은 '락'을 걸지 않고 파일을 엽니다. 즉, 이 '락'이라는 것은 컴퓨터 기술적으로 필요한 것이 아니라, 논리적으로, 업무적으로 필요한 것이라는 이야기입니다.
엑셀은 누군가 파일을 열면, 나머지는 열지 못하게 프로그램되어 있는 것이죠.
'락'을 왜 걸까요? 동시성 문제를 해결하기 위함입니다.
동시성 문제는 다음과 같은 상황에 발생합니다.
제가 데이터를 편집했습니다.
제품코드 제품명 비고
-----------------------------
PROD-001 제품1 좋은 제품
이렇게 하고 저장을 했지요. 그런데 다른 사람(A)이 이 행을 열고 다음과 같이 편집했습니다. 아직 저장을 안 한 상태이고요.
제품코드 제품명 비고
-----------------------------
PROD-001 제품1 좋은 제품. 고가의 제품이므로 주의 요망
그런데 제가 갑자기 잊고 기록하지 않은 것이 생각나서 다시 엽니다. A가 저장하고 있지 않으니 다음과 같이 보이겠죠.
제품코드 제품명 비고
-----------------------------
PROD-001 제품1 좋은 제품
저는 이렇게 고칩니다. 그리고 저장합니다.
제품코드 제품명 비고
-----------------------------
PROD-001 제품1 좋은 제품. 2010-07-23 등록됨
A가 저장합니다. 그러면 행은 최종적으로 이렇게 보이게 됩니다.
제품코드 제품명 비고
-----------------------------
PROD-001 제품1 좋은 제품. 고가의 제품이므로 주의 요망
문제는, 제가 등록한 내용인 '2010-07-23 등록됨' 이라는 내용이 사라져 버린다는 겁니다. 제가 저장한 다음에 A가 편집했으면 그냥 저렇게만 저장되지는 않겠죠. A는 '최신'이 아닌 상태에서 데이터를 편집한 상태가 되고, 이것이 문제가 되는 것입니다.
어떤 분의 경우, 언바운드로 작업한다고 하셨는데, 아무런 오류 메시지 없이 '저장'이 되어 버립니다. 메시지가 표시 안된다 뿐이지 오히려 동시성 문제는 고려하지 않는 방식이 '언바운드' 처리 방식이라고 할 수 있겠습니다. 대부분의 웹 시스템이 이렇게 개발되죠.
문제는 이런 '동시성' 문제가.. 정말 드물게 일어난다는 것입니다.
동시성 문제에 대한 기본 정책은.. 동시성 문제가 일어나지 않도록 테이블을 설계하는 것이 첫번째입니다. 충분히 정규화된 데이터에서 동시성 문제가 일어난다는 것은 아마도 업무 프로세스상의 문제일 가능성이 높기 때문입니다.
따라서 업무 프로세스상 문제가 아니라면, 동시성 문제는 어느 정도는 안고 가야 하는 문제입니다.
저는 사용자들에게 교육할 때 '쓰기 충돌' 오류가 발생하면 '변경내용 취소' 후 다시 입력하라고 이야기합니다. 이것이 데이터 무결성을 보장하는 가장 좋은 방법이기 때문입니다.
댓글을 달아 주세요
단일 프로세스 혹은 쓰레드에 의해 단순하게 작동하는 프로그램이라면 통용될 수 있겠지만,
분산환경에서 동시성 제어는 필수적인걸요..;ㅅ;