2011-09-13 5 views
2

쿼리를 고려 변수 해킹을 설정 get)는 @xxx를 다른 정수로 설정합니다.MySQL은

또한 정확히 @xxx의 범위는 무엇입니까?

나는이 변수가 특정 쿼리의 수명을 위해 원하는 값으로 설정되도록 보장하기 위해 (비록 해킹 되긴하지만) 안전한지를 결정하려고합니다.

이러한 쿼리는 MySQL 5.5의 단일 인스턴스에 대해 실행되며 동일한 연결 또는 데이터베이스에 대한 다른 연결에서 수행 될 수 있습니다.

답변

2

방금 ​​테스트 한 내용에서 변수가 현재 연결에만 표시되는 것으로 보입니다. 또는 더 정확하게 연결이 설정되어 있어야합니다.

나는 귀하의 SQL 선언문이 User Defined Variables의 과 동일한 효과가 있다고 생각합니다.

사용자 정의 변수는 연결 별 다음과 같습니다

에 대한 문서는 상태. 즉, 한 클라이언트가 정의한 사용자 변수를 다른 클라이언트가 보거나 사용할 수 없습니다. 클라이언트가 종료되면 해당 클라이언트 연결의 모든 변수가 자동으로 해제됩니다.

이렇게 다른 쿼리를 사용하는 경우 별도의 연결이 있으므로 @xxx의 자체 복사본을 가지므로 서로 간섭하지 않습니다. 그리고 해킹이 예상대로 작동합니다. 그러나 동일한 연결이 사용되고 쿼리 실행 순서가 보장되지 않으면 다른 쿼리가 @xxx를 변경하고 후속 쿼리에 영향을 미칠 수 있습니다. 이 항상 1을 반환하는 경우

대하여 :

SELECT @xxx As thevar FROM (SELECT @xxx:=1) as temp 

이 있었으나 동일한 연결을 사용하는 동일한 연결을 사용하여 별도의 스레드가 실행하는 특이 기회가 있으면 SET @xxx=2 직후 서브 쿼리의 실행 및 외부 선택하기 전에. SELECT의 ATOMICITY에 대해 내가 틀렸다면 나를 바로 잡으십시오.

+0

내 테스트는 연결 당 격리 된 것과 동일한 결과를 보여줍니다. 그러나 select 문의 원 자성에 대해서는 여전히 궁금합니다. 첫 번째 select가 변수를 읽기 전에 두 번째 select가 변수를 변경할 가능성이 적기 때문입니다. – bradvido