2013-08-01 6 views
1

테이블에서 선택하는 값을 저장 프로 시저에 저장 한 다음 테이블 B에서 선택하는 값을 사용합니다. 행 수가 임계 값보다 작은 경우 테이블 A의 값을 업데이트하고 테이블 B를 다시 선택합니다Mysql - 저장 프로 시저 동시성 문제

Select val into v from A; 
Select ID from B where total > v; 

if (Found_Rows() < 3) then 
    Update A set val = val +1; 
end if; 

이 저장 프로 시저가 동시에 실행되고 행 수가 3보다 많고 업데이트가 여러 번 실행되는 것이 걱정됩니다.

먼저 이렇게 할 수 있습니까? 그렇다면 Lock이 스토어드 프로 시저에서 허용되지 않으므로이를 어떻게 막을 수 있습니까?

미리 감사드립니다.

+0

잠시 동안 이것을 생각한 후에 업데이트를 업데이트하면 Set val = v + 1; 나는 동시 처리를 모두 값을 설정하게 할 것이다. 그러나 그것들은 같은 것으로 설정 될 것이다. – vbbartlett

+0

'B에서 ID를 선택하시오. 어디에서> v;'('val'이 아닌)? – RandomSeed

+0

네, 그건 v가 아니라 ... 편집 게시 – vbbartlett

답변

0

무조건 테이블 A 전체를 업데이트하고 있습니다. 따라서 (심지어 InnoDB를 사용하는 경우에도) 전체 테이블은 업데이트 시간 동안 독점 모드로 잠길 것이다. 이 잠금은 엔진에 의해 자동으로 획득되고 해제됩니다.

당신은 안전하고 동시성이 있습니다. 업데이트가 완료 될 때까지 A에서 읽으려고하면 모든 동시 스레드가 보류 상태가됩니다.

그러나 (최종 의견과 달리) 모든 UPDATE은 순차적으로 발생하며 각각은 A.val으로 증가합니다.

+0

처리 속도가 느려 집니까? 이 절차를 호출하는 많은 연결이있을 수 있습니다. 선택하고 테스트하는 두 개의 절차와 실제로 업데이트를 수행하는 두 번째 절차로 나누는 것이 낫겠습니까? 전체 테이블을 잠그는 것을 멈출까요? – vbbartlett

+0

일어날 일은 드물게 원인이 성공해야하는 경우입니다. 필요하지 않으면 잠금을 원하지 않습니다. – vbbartlett

+0

테이블은'UPDATE' 문이 실행되는 동안 잠겨지며'SELECT' 문에는 잠기지 않습니다. 'UPDATE'가 실행되지 않으면 테이블은 전혀 잠기지 않습니다. – RandomSeed