나는 여전히 테이블 행 잠금에 대해 혼란스러워합니다. 저는 MySQL/PHP를 사용하고 있습니다. 여기에 제 시나리오가 있습니다.행 레벨 잠금 - MySQL - 업데이트 용
내 응용 프로그램에서 요청 및 게시물을 추적하는 데 사용하는 테이블 집합이 있습니다. 사용자는 항목 (테이블 ITEM (I))에 대한 전기 (테이블 POSTING (P))를 생성하고 개별 사용자 (테이블 REQUEST (R))에 요청을 발송하거나 게시하고 게시물 응답))이 사용자 게시 항목에서 허용됩니다.
예 : 저는 자전거를 소유 한 사용자입니다. 나는 그것을 게시하고 개별 사용자에게 요청을 보냅니다. 나로부터 요청을받는 사용자는 수락/거절/또는 아무 것도 할 수 없습니다. 그들이 수락하면 - 예약되어 있습니다. 다른 사용자는 내 게시물을 찾고 항목에 '적용'할 수 있습니다. 나는 그들의 요구를 '받아들이거나'무시할 수있는 능력이있다. 동의하면 항목이 예약됩니다.
내가 누군가가 요청을 허락하고 싶지 : ITEM (I)에서
잠금 행을 항목에 게시 (P)의
잠금 행을 해당 테이블을 테이블 (행이있는 경우) 항목
로크 행에 대해 전송 된 요청에 대한 요청의 항목
로크 행을 대응하는 (R) 테이블 (들) POSTING_RESPONSE (PR) 테이블 (행이 존재하는 경우) 어떤 POSTING_RESPONSE에/모든
갱신 '없음'으로
업데이트 게시 상태 '예약'에 항목
업데이트 항목 상태를 대응에 모든 요청이 수락 한 외에 '거부'하는
갱신 '거부'- 업데이 트를 하나
이 예제에서는 상태 중복을 무시하십시오.
이제 AUTOCOMMIT을 false로 남겨두고 # 1-4가 "select ... for update"와 함께 수행 될 수 있다고 가정했습니다. 업데이트 여부에 관계없이 이러한 선택 진술로 저지 할 수 있습니다. 그렇다면 업데이트를 계속할 수 있습니다. 그런 다음 업데이트 # 5 ~ 8을 완료 한 후 커밋하고 행을 잠금 해제합니다.
나는이 문제를 해결하는 데 어려움을 겪고 있으며, 내가하고있는 일이나 내 생각이 올바르지 않기 때문에 문제인지 알 수 없습니다.
한 가지 더 ... 항목의 상태를 EXPIRED (취소됨) 또는 CANCELLED (취소됨)로 업데이트 할 수있는 다른 프로세스가 있습니다. 내 접근 방식의 유일한 해결책은 UPDATE 문 내에서 WHERE 절에 가능한 모든 조건을 넣는 것이 아니라는 점입니다.이 방법은 쉽게 유지 보수 할 수 없습니다.
일반적으로 SELECT는 비 잠금 식으로 읽습니다. SELECT를 잠 그려면 [잠금 읽기] (http://dev.mysql.com/doc/refman/5.6/en/innodb-locking-reads.html)를 지정해야합니다. –
@JayBlanchard, 설명해 주시겠습니까? 어쩌면 나는 단지 두껍다.하지만 내가 모인 것에서 당신의 심판을 살펴봤을 때, 두 가지 옵션 만있다 : LOCK IN SHARE MODE - 읽기를 막지 않을 것이다 - 그리고 FOR UPDATE - 위의 예에서 보는 바와 같다. . 위의 예에서 FOR UPDATE가 작동하지 않습니까? 그렇지 않다면, 무엇을해야합니까 ?? – NEW2WEB
아니요, 방금 읽지 않으 셨습니다. 당신에게 효과가없는 것은 무엇입니까? –