이 시나리오를 보면 사용자가 여러 행을 동시에 수정할 수있는 표가 있습니다. 누군가가 레코드를 수정하면 다른 사람들이 같은 레코드를 수정할 수 없기를 바랍니다. 예는, 3 열 (ID, 텍스트, 플래그)와 표있다 :Mysql에서 레코드를 수정하는 동시성 제어를 수행하는 가장 우아한 방법은 무엇입니까?
ID-text-flag 11-txt1-0 12-txt2-0 13-txt3-0 14-txt4-0
내가 MySQL의에서 동시성 제어, 사람들이 MySQL의에서 SELECT ... FOR UPDATE
또는 SELECT ... LOCK IN SHARE MODE
을 사용하는 것이 좋습니다 1 솔루션에 대한 몇 가지 조사했다. 그러나이 솔루션에는 제한 사항이 있습니다. 즉, 레코드를 선택하면 즉시 업데이트해야합니다. 예를 들어 :
SELECT text FROM table1 where ID<=20 FOR UPDATE;
UPDATE table1 SET text = 'new text' where ID<=20;
그러나, 내 응용 프로그램은 업데이트 커밋하기 전에 다음 사용자가 해당 데이터에서 작동하는 많은 시간을 보낼 수있는 GUI를 &에 데이터를 다운로드하는 사용자가 필요합니다.
두 번째 솔루션 인 Mysql은 Row Lock 메커니즘을 제공하지만이 솔루션은 InnoDB를 사용해야합니다. & 오버 헤드가 상당히 높습니다.
또 다른 옵션은 mysql에서 테이블 잠금을 사용하는 것입니다. 오버 헤드는 매우 낮지 만 몇 시간 동안 전체 테이블을 잠글 수는 없습니까? 예를 들어, 사용자 A는 레코드 1에서 10을 수정할 수 있고, 동시에 사용자 B는 레코드 11에서 20을 수정해야 할 수 있으므로 사용자 B는 사용자 A가 수정을 마칠 때까지 기다리지 않아야합니다.
제 의견으로는, 사용자 A가 일부 레코드를 수정할 때 열 "플래그"를 갖고 싶습니다.이 레코드의 플래그가 1로 바뀌고 사용자 B가 동일한 레코드를 수정하려고하면 시스템이 팝업됩니다 누군가가 그것을 수정하고 있다고 말하는 메시지. 사용자 A가 완료되면 플래그가 0이되고 & 사용자 A는이 동일한 레코드를 수정할 수 있습니다.
그러나이 솔루션에는 복잡한 문제가 있습니다. 사용자 A가 데이터를 저장하지 않은 경우 어떻게해야합니까? 그런 일이 생기면 그 깃발은 영원히 하나입니까? 그런 다음 몇 시간이 지나면 기한이 만료 된 상태 여야합니까? & 어떻게 할 수 있습니까?
특정 시간 후에 플래그를 0으로 되돌리려면 타임 스탬프 또는 메커니즘이 필요할 수 있습니다. 그러나 이것은 내가 생각했던 것보다 더 복잡합니다. DB에 1 시간마다 플래그의 타임 스탬프를 확인하도록 할 수는 없습니까?
-> 가장 세련된 해결책인지 잘 모르겠습니다. DB 디자인에 대한 상업적 경험이 없습니다 & DB 사용자가 상용 환경에서이 문제를 어떻게 관리하는지 알고 싶습니까?
더 좋은 & 해결책을 찾을 수 있습니까?
이노 (새 레코드를 삽입하는 경우에 대한) 자동 증가 ID를 사용할 수 있습니까? http://en.wikipedia.org/wiki/Lock_(database를) http://en.wikipedia.org/wiki/Optimistic_concurrency_control 그것은 확실히 확장에 약간의 오버 헤드를두고 – Drew
의도 잠금이 있습니다 시스템, 그러나 당신은 낙천적 인 실패 할 때 무엇을해야 할지를 알아야합니다. 이러한 단순한 접근 방식은 일반적으로 복잡한 동시성이 많은 테스트와 성능에 영향을주기 때문에 바람직합니다. 그러나 특정 유스 케이스에서는 이것을 사용하지 않을 것입니다. 만약 당신이 그때 환상적인 작품! – zerkms