2012-02-13 5 views
0

mysql에서 사용자 정의 변수에 @를 사용합니다.이 변수는 연결이 닫힐 때까지 살아 있습니다. 여러 스레드가 하나 개의 연결 풀을 공유 할 때 저장 프로 시저를 호출하는 동안 자바에서 동시에 순위를 얻을 수 있습니다 :연결 풀의 mysql 사용자 정의 변수 동시성?

2 개 스레드가 @rank 동기화하지 않고, 같은 시간에 프로 시저를 호출하는 경우
BEGIN 
    SET @rank := 0; 
    SELECT @rank := @rank + 1 as rank FROM ... 
END 

것이 가능 @rank 수도있다 예기치 않은 결과를 반환합니까?

이 상황을 처리하는 더 좋은 방법이 있습니까?

감사합니다.

답변

0

"예기치 않은 결과"를 얻었는지 여부는 예상 한 결과에 따라 달라지며 이는 귀하의 질문에서 나에게 명확하지 않습니다.

변수를 특정 연결로 분리하려고하거나 공유 카운터로 증가 시키려고합니까?

사용자 정의 변수의 범위는 단일 연결로 제한되며 각 연결은 주어진 시간에 단일 스레드에 의해 사용되므로 예제에서 각 연결 내에서 값이 분리되어 있어야합니다. 코드에서 값을 0으로 다시 초기화하기 때문에 이전에 연결을 사용했던 별도의 프로세스에서 잔여 효과가 나타나지 않아야합니다.

그러나 저장 프로 시저를 사용한다고 했으므로 저장 프로 시저 내부에 로컬 변수를 선언하고 사용자 정의 변수 대신 해당 변수를 사용하는 것이 좋습니다.

로컬 변수는 저장 프로 시저로 범위가 지정되므로 연결을 다시 사용하는 이후 스레드에 영향을주는 현재 값에 대해 걱정할 필요가 없습니다.

+0

답장을 보내 주셔서 감사합니다. 사실 나는 로컬 변수를 사용해 보았습니다. 하지만 'SET rank : = 0; SELECT rank : = rank + 1 ... '': = '이 지원되지 않아'rank : = rank + 1 '이 잘못되었다는 오류가 발생합니다. 이유를 모르겠다. – Lee