2010-07-29 4 views
1

사이트에 레코드 잠금을 추가하려고합니다. 이것은 데이터베이스 잠금이 아니며 동일한 레코드를 동시에 편집하는 2 개의 프로세스가 있지만 대신 동일한 레코드를 동시에 편집하는 2 명의 사용자가 있습니다. 상황은 다음과 같습니다.다른 사용자가 레코드를 편집하는 동안 편집에서 레코드를 차단하는 방법 - 어떻게?

한 사람이 편집 중일 때 다른 사람이 동시에 레코드를 변경할 수 있으므로 혼동을 일으킬 수 있으므로 레코드를 잠글 수 있어야합니다. 사용자 A가 레코드 편집을 시작하면 어떤 일이 발생할 수 있습니다. 사용자 A가 레코드를 저장하기 전에 사용자 B가 레코드 편집을 시작합니다. 이제 사용자 A는 "0001"값을 갖는 field_a와 함께 레코드를 저장합니다. 이제 사용자 B는 오래된 레코드 버전을보고 편집하고 있습니다. 그런 다음 사용자 B는 레코드를 "0002"값으로 저장합니다. 데이터베이스는 000의 값으로 끝납니다.

나는 어떤 일이 일어 났는지 알 수 있지만, DB의 값이 0001 대신 0002가된다는 것을 알아내는 것은 어렵습니다. 제 경우에는이 값을 사용하고 있습니다. 번호를 사용하여 온라인 데이터베이스의 레코드를 다른 레코드에 연결합니다. 이 경우 온라인 시스템의 레코드 1 개에 대해 다른 시스템에 2 개의 레코드로 끝납니다.

내 생각 엔 사용자 ID를 필드에 입력하여 레코드를 "잠그는"것입니다. 0 일 때 잠겨 있지 않습니다. > 0이 잠겨 있습니다.

사용자가 레코드를 편집을 클릭
  • , 그들은 레코드에 대한 잠금을받을 것이다 : 여기

    상황이이 기능을 것입니다 방법에 대한 내 생각이다.
  • 최대 X 분 (아마도 30) 동안이 잠금을 갖습니다. 그 이유는 저장 또는 취소 대신 뒤로 버튼을 클릭하기 때문입니다.
  • 일단 저장하면 레코드의 잠금이 해제됩니다.
  • 저장하지 않고 잠금 장치를 제거하려면 편집 페이지에서 "잠금 해제"(또는 이와 유사한)를 클릭해야합니다. 나는 취소 할 것이나, 나는 그 (것)들을 취소하고 아직도 자물쇠에 붙들 것을 원한다.
  • 레코드 목록에는 모든 사람이 알 수 있도록 레코드를 잠근 사람의 이름이 포함됩니다.
  • 관리자는 레코드에 대한 잠금을 제거 할 수 있습니다. 모든 레코드가 분리됩니다.
  • 모든 페이지에 영역을 추가하여 현재 레코드를 잠금 해제해야하거나 모든 페이지에 잠긴 레코드 수만 표시할지 사용자에게 경고합니다.
  • 30 분 이상 잠긴 레코드를 확인하고 잠금을 해제하는 스크립트를 추가하십시오 (레코드를 잠근 사용자에게 전자 메일을 보낼 가능성이 있음).

궁금한 점은 내가 누락 된 사례가 있으면 슬픔을 느끼게 될지 아니면 어떻게해야하는지에 대한 제안이 있다면 궁금합니다.

참고 : 저는 PHP와 MySQL로 작업 중이며 웹 응용 프로그램입니다. 또한 데이터베이스에서 레코드 잠금이 필요하다고 생각하지 않습니다.

- 추가 : Dan Hulton의 제안은 체크 아웃 한 마지막 시간을 저장할 날짜 필드를 추가하는 것이 었습니다. 이렇게하면 만료 된 체크 아웃을 확인하기 위해 스크립트가 제거됩니다. 대신 시스템은 레코드의 편집 또는 편집을 제한 할 때이 날짜를 확인합니다.

답변

2

자, 일부 잠금 스키마가 필요합니다.

  • 담당자가 해당 레코드 (들)과 버전 번호는
  • 누군가가 파일을 열 때 : 당신에 대해 얘기하고 물건의 종류, 사람들은 다음과 같이 작동 "낙관적 잠금을"사용 편집, 버전 번호 추적을 계속 하시겠습니까?
  • 누구든지 파일을 저장하려고하면 버전 번호를 확인하십시오. 검색된 버전 번호와 버전 번호가 같으면 을 저장 한 다음 버전 번호를으로 증가시킵니다. BUT 버전 번호가 파일을 열 때 저장 한 번호와 같지 않으면 충돌이 발생합니다. 당신이보고 있지 않을 때 다른 누군가가 기록을 변경했습니다.

  • 충돌이있는 경우 사용자에게 어떻게 든 해결하도록 요청하십시오.

은 (이것은 "낙관적"이라고 당신은 대부분의 시간을 당신은 두 명의 사용자가 동시에 업데이트하려고하지 것이라고 가정하고 있기 때문이다.)

pessimmistic 버전 이것은 자물쇠에 대한 필드를 가지고있을 것입니다. 누군가 편집 할 레코드를 열면 해당 필드를 확인하십시오. 0 인 경우 편집 할 수 있지만 필드에 1을 추가 할 수 있습니다. 저장하면 1을 다시 뺍니다. 0이 아닌 경우 사용자가 편집하도록 허용하지 않습니다.

+0

좋은 생각이지만 이번에는 비관적 인 잠금 기능을 사용해야한다고 생각합니다. 내 생각에 2 명이 파일을 편집 할 가능성이 높기 때문입니다. –

+2

어떤 잠금 전략이라도 어느 시점에서 잠금을 해제해야한다는 것을 기억하십시오. 웹 애플리케이션의 경우 까다 롭습니다. 브라우저를 닫으면 기록이 잠긴 상태입니까? 응용 프로그램은 어떻게 알 수 있습니까? 얼마나 오래 잠겨 있니? 세션 타임 아웃, 로그 아웃 등 모든 열린 잠금을 정리하십시오. –

+0

레코드를 편집하는 동안 매 N 초마다 AJAX 요청을 실행하여 잠금을 확인합니다. N은 만료 기간보다 짧아야합니다. 잠금 시간 소인은 잠금이 해제되지 않도록 갱신됩니다. 잠금 확인은 잠금과 동일하게 작동합니다. 참고로 http://webcheatsheet.com/php/record_locking_in_web_applications.php –

관련 문제