2012-04-03 2 views
0

innoDB에 대한 행 잠금을 찾고 있었고 SELECT...FOR UPDATE은 잠금 쿼리로 이동하는 것 같습니다. 내 파일에는 세 가지 쿼리가 있습니다. 두 번의 업데이트와 삽입. 각 연결에 대해 행이 잠겨 있는지 확인한 다음 다른 누군가가 행을 변경하기 전에이 세 가지 쿼리를 실행할 수 있습니까?여러 쿼리에 대해 innoDB에서 행을 잠급니다.

다음은 쿼리입니다

"UPDATE table SET r=r+2 WHERE r > '$l' AND home='$home'"; 

"UPDATE table SET l=l+2 WHERE l > '$l' AND home='$home'"; 

"INSERT INTO table (value, home, l, r, value2) 
      VALUES ('$value', '$home', '$l'+1, '$l'+2, value2) "; 

는 명확히하기 위해 : 다음 홈 = $ 홈과 세 개의 쿼리 후에 무료 모든 행을 잠급니다. 다른 모든 연결이 해당 행에 쓰기 기능을 갖기 전에 세 가지 쿼리가 실행되도록하고 싶습니다.

+0

거기에없는 행을 잠글 수 없습니다. 따라서 모든 "3"행을 잠글 수있는 방법은 없습니다. 'UPDATE'하는 두 행만 잠글 수 있습니다. –

+0

@a_horse_with_no_name 네, 그런 소리가 나는 것 같아요. 나는 home = $ home에있는 모든 행을 잠근 다음 세 가지 쿼리가 완료된 후에 freeing하는 것을 의미합니다. 그래서 'LOCK UNTIL FREE'와 같은 쿼리가 나온 다음'FREE '쿼리가 나온 것입니다. – qitch

+0

커밋 할 때까지 업데이트 된 행은 잠겨집니다. 업데이트가 가장 먼저하는 일이라면 필요한 모든 것입니다. –

답변

1

트랜잭션을 사용하면 명시 적으로 커밋해야 변경 사항을 다른 사람이 볼 수 없습니다.

추가 정보 : msql docs on transactions

관련 문제