2011-03-23 3 views
4

FOR UPDATE을 지정하는 이유가 무엇인지 혼란 스럽습니다. 데이터베이스가 SELECT의 데이터로 무엇을 할 것인지 신경 써야하는 이유는 무엇입니까?SELECT ... * FOR UPDATE *의 목적은 무엇입니까?

편집 : 죄송합니다. 질문을 잘 못했습니다. 나는 문서가 "잠금 읽기"로 바뀌 었다고 말한 것을 알고 있습니다 - 내가 알고 싶은 것은 "관찰 할 수있는 행동이 FOR UPDATE을 지정하는 것과 지정하지 않는 것 사이에 어떤 경우가 존재 하는가? 즉, 구체적으로 무엇을하는지 그 잠금 수반 업데이트하고 커밋 또는 롤백 할 및 잠금을 해제 할 때까지 UPDATE에 대한

답변

9

http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

그것은 거래에서 테이블 잠금과 관련이있다. 의는 다음과 같은 당신이 있다고 가정 해 봅시다 : SELECT 문 실행 후

START TRANSACTION; 
SELECT .. FOR UPDATE; 
UPDATE .... ; 
COMMIT; 

을, 다른 사용자로부터 다른 선택이있을 경우 첫 번째 트랜잭션이 COMMIT 라인을 돌 때까지, 그것은 실행되지 않습니다.

트랜잭션 외부의 FOR UPDATE은 의미가 없습니다.

+0

예 - 문서를 읽었습니다.하지만 RDBMS 사용자는 어떻게해야합니까? –

+0

업데이트 된 답변 –

+0

아 - 이렇게하면'START TRANSACTION; SELECT MAX (id + 1) as 새 ID from FOR 테이블 FOR 업데이트; thetable (id)에 삽입하십시오 VALUES (newid); COMMIT;'- MAX() + 1에 대해 반환 된 값이 다른 누구와도 충돌 할 수 없다는 것을 알 수 있습니까? –

0

완료 될 때까지 아무도 그것을 업데이트 할 수 없도록 잠금 읽기를 작성합니다 (예 :

). (210)
SELECT counter_field FROM child_codes FOR UPDATE; 
UPDATE child_codes SET counter_field = counter_field + 1; 

은 행이 동시에 다른 세션에서 업데이트 할 수 있도록이 행 (또는 전체 테이블)을 잠급니다 여기 http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

+0

"완료되면 어떻게 알 수 있습니까?" –

+0

성명서가 끝나면 – SQLMenace

+0

응? 문장은 세미콜론으로 완성됩니다! ("FOR UPDATE"와 세미콜론 사이에 무엇이 갈 수 있습니까?) –

0

참조하십시오. 잠금은 트랜잭션이 확약되거나 롤백 될 때까지 보류됩니다.

1

이 문제를 해결하기 위해 설계된 특정 경우는 열의 값을 읽고 업데이트해야하는 경우입니다. 때때로 당신은 예를 들어, 나중에 그것을 읽는 먼저 열을 갱신 (를 고정하는)와 함께 멀리 얻을 수 있습니다 :

UPDATE child_codes SET counter_field = counter_field + 1; 
SELECT counter_field FROM child_codes; 

이 counter_field의 새 값을 반환합니다,하지만 응용 프로그램에서 허용 될 수있다. 필드를 재설정하려는 경우 (따라서 원래 값이 필요함) 또는 업데이트 명령문에서 표현할 수없는 복잡한 계산이있는 경우에는 허용되지 않습니다. 이 경우 동일한 열을 동시에 업데이트하기 위해 두 개의 연결을 피하기 위해 행을 잠글 필요가 있습니다.

RDBMS가 FOR UPDATE를 지원하지 않으면 쓸모없는 업데이트를 수행하여 시뮬레이션 할 수 있습니다.

UPDATE child_codes SET counter_field = counter_field; 
SELECT counter_field FROM child_codes; 
UPDATE child_codes SET counter_field = 0; 
관련 문제