0

이 시나리오를 보면 사용자가 여러 행을 동시에 수정할 수있는 표가 있습니다. 누군가가 레코드를 수정하면 다른 사람들이 같은 레코드를 수정할 수 없기를 바랍니다. 예는, 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 사용자가 상용 환경에서이 문제를 어떻게 관리하는지 알고 싶습니까?

더 좋은 & 해결책을 찾을 수 있습니까?

+0

이노 (새 레코드를 삽입하는 경우에 대한) 자동 증가 ID를 사용할 수 있습니까? http://en.wikipedia.org/wiki/Lock_(database를) http://en.wikipedia.org/wiki/Optimistic_concurrency_control 그것은 확실히 확장에 약간의 오버 헤드를두고 – Drew

+0

의도 잠금이 있습니다 시스템, 그러나 당신은 낙천적 인 실패 할 때 무엇을해야 할지를 알아야합니다. 이러한 단순한 접근 방식은 일반적으로 복잡한 동시성이 많은 테스트와 성능에 영향을주기 때문에 바람직합니다. 그러나 특정 유스 케이스에서는 이것을 사용하지 않을 것입니다. 만약 당신이 그때 환상적인 작품! – zerkms

답변

0

Zerkms가 제안했듯이 우리는 플래그가 전혀 필요하지 않지만 우리의 어플리케이션에서는 "레코드 비교 시스템"을 구축해야합니다.

좋아, 그가 기록 & 수정 후 그가 실제로 DB를 업데이트하기 전에 사용자가 레코드 비교 시스템은 ID & 사용자 만이 데이터의 이전 텍스트 (안 새 데이터를 확인합니다, 업데이트 데이터를 다운로드 할 수 있습니다 말한다 수정 된) 동일한 ID를 가진 & DB에있는 데이터의 현재 텍스트가 동일하면 업데이트를 커밋 할 수 있지만 다른 경우 다른 사람이 그 전에 레코드를 업데이트 했으므로 시스템에서 그를 허용하지 않습니다 최신 정보. 그런 다음 데이터를 다시 다운로드해야합니다 (&).

는 두 사용자가 동시에 같은 레코드를 업데이트하는 것이 매우 드문, 그래서 난이 솔루션은 오버 헤드가 증가하지 않는 &을 쉽게 구현할 수 & 확실히 가능하다고 생각하기 때문에. 이것은 응용 프로그램 수준에서 레코드 비교 시스템을 구축 할 때 낙관적 인 동시성 제어라고 불리며, 따라서 데이터베이스 오버 헤드가 수반되지 않습니다. 내 애플리케이션 요구에 가장 적합한 솔루션이라고 생각합니다.

그렇게 생각하니?

참고 :이 시스템에 대해, 우리는

+0

: 당신은 응용 프로그램 수준의 잠금을 필요 – Drew

+0

난 그냥 텍스트를 업데이 트하거나 뭔가를 업데이 트하지 않아도됩니다. 그래서이 해결책은 아주 좋습니다. – Tum

+0

통화가 아닌 동시성 – Drew