2012-06-12 4 views
0

내 요구 사항은 사용자가 클릭하여 거래를 할 수 있다는 것입니다. 하나의 멤버 만 한 거래를 사용할 수 있으므로 사용자가 거래를 시도하고 잠금을 해제하려고하면 테이블을 잠급니다. 따라서 두 명의 사용자가 클릭하여 거래를 시도하면 대기열이 형성되어 두 명의 사용자가 거래를 할 수 없게됩니다.MySQL 잠금을 처리하는 방법은 무엇입니까?

코드는 이제

LOCK TABLES deal WRITE; 
//MySQL queries and my php code goes here. 
UNLOCK TABLES; 

문제이며, 무엇을 어떤 문제가 잠금 및 잠금 해제 사이에 내 PHP 코드를 발생하는 경우, 테이블이 영구적으로 고정 얻을 것 같다? 어쨌든 내가 테이블을 잠글 수있는 최대 시간을 설정할 수 있습니까?

+0

나는 당신이 (http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html가) 여기에 읽기 시작] 제안 -이 질문에 대한 답변을 포함 – ManseUK

답변

0

내가 자택에 있었다면 locked_deals라는 데이터베이스 테이블을 만들었을 것입니다. deal_id라는 열이 있습니다. 사용자가 거래를 선택하면 deal_id가 locked_deals 테이블에 삽입됩니다. 다음 사용자가 동일한 거래를 클릭하면 deal_id가 잠금 테이블에 있는지 먼저 확인합니다. 그렇다면 사용자가 거래를 선택할 수 없습니다. 마지막으로 모든 것이 잘 진행되면 프로세스 마지막에 잠금 테이블에서 lock_id를 삭제할 수 있습니다. PHP 코드에서 예외로 인해 테이블에 갇혀있는 lock_ids에 대해서 - 우리는 locked_deals 테이블에서 매 n 분마다 붙어있는 id를 지우는 배경 서비스를 만들 수 있습니다 (마지막 n 분 동안 막혔습니다). 도움이 되길 바랍니다.

+0

이것은 작동하지 않습니다 : 프로세스가 다른 테이블이 lock_id를 찾지 못하고 테이블을 체크 한 직후 lock_id를 테이블에 추가 할 수 있습니다. 이 경우 두 번째 프로세스는 lock_id를 테이블에 추가합니다. 여기에 네이티브 MySQL 잠금이 필요합니다. – Aurel

+0

@Aurel lock_id를 기본 키로 만들면 두 명의 사용자/프로세스가 동일한 deal_id를 테이블에 추가 할 수 없음을 확인할 수 있습니다. lock_ids 테이블에 deal_id를 추가/삭제하는이 전체 프로세스는 저장된 proc를 통해 수행되며 모든 기본 키 위반이 쉽게 처리 될 수 있으므로 단 하나의 사용자/프로세스 만 특정 거래에 대한 잠금을 확보 할 수 있습니다. – Luftwaffe

0

클라이언트 세션에 대한 연결이 정상적으로 또는 비정상적으로 종료되면 서버는 세션에서 보유한 모든 테이블 잠금을 암시 적으로 해제합니다.

Source

관련 문제