2010-03-07 3 views
4

MySQL :테이블 업데이트시 읽기 방지

1 분마다 테이블을 비우고 새 데이터로 채 웁니다. 이제 사용자가 채우기 프로세스 중에 데이터를 읽지 않아도되기를 바랍니다.

어떻게해야합니까? 트랜잭션이 방법입니까?

답변

3

트랜잭션 엔진 (일반적으로 Innodb)을 사용한다고 가정하면 동일한 트랜잭션에서 테이블을 지우고 다시 채 웁니다.

은 당신의 독자가 READ_COMMITTED 이상의 트랜잭션 격리 수준 (기본값은 높다 REPEATABLE READ입니다)을 사용하는 것이 있는지 확인하십시오.

그런 식으로 독자는 업데이트 도중 테이블의 이전 내용을 계속 읽을 수 있습니다.

이 조심해야 할 몇 가지가 있습니다 : 테이블이 롤백 영역을 소모 너무 큰 경우

  • - 당신이 (말)을 1M 행 테이블 전체를 업데이트 할 경우이 가능하다. 트랜잭션이 과정에서 부분적으로 실패하고 롤백됩니다 경우 물론이 조정하지만 한계는
  • 가 - 다시 큰 거래를 압연하는 (이, 커밋 아니 롤백을 최적화) 이노 매우 비효율적이다
  • 교착 상태에주의 큰 트랜잭션을 사용할 경우 더 많은 잠금 대기 시간 초과가 발생할 수 있습니다.
2

당신은 당신의 작업을 수행하는 동안 테이블을 LOCK 수 있습니다

http://dev.mysql.com/doc/refman/5.1/en/lock-tables.html

테이블 잠금 부적절한 읽거나 다른 세션이 기록만을 보호합니다. 잠금을 보유하고있는 세션은 읽기 잠금조차도 테이블 수준 작업 (DROP TABLE 등)을 수행 할 수 있습니다. 자르기 작업은 트랜잭션 보안이 아니므로 활성 트랜잭션 또는 테이블 잠금을 유지하는 동안 세션이 세션을 시도하면 오류가 발생합니다.

(존재하는 경우, 실제로 나) 내가 MySQL의 내부 행 버전 메커니즘에 대해 충분히 모르겠지만, 다른 데이터베이스 (오라클, PostgreSQL을, 그리고 더 최근에, SQL Server가) 많이 투자 한

작성자가 이 아닌 독자를 차단하도록하기위한 노력의 일환으로, 독자는 갱신/쓰기 프로세스가 시작되기 직전의 행 버전에 액세스 할 수 있습니다. 업데이트가 커밋되면 해당 행의 버전이 모든 독자에게 제공되는 버전이되어 MySql의 위 동작에서 소개 할 병목 현상을 피할 수 있습니다.

이 정책은 테이블 잠금 이 교착 상태가 없음을 보장합니다. 그러나, 다른 것들 당신은이 정책에 대한 알고있을 필요가있다 : 당신이 테이블에 대한 LOW_PRIORITY 쓰기 잠금을 사용하는 경우, 만 다른이 될 때까지 MySQL은 이 특정 잠금을 기다리는 것을 의미한다 READ 잠금을 원하는 세션 세션이 WRITE 잠금을 받았고 잠금 테이블 목록의 다음 테이블에 대해 잠금을 얻으려고 대기 중이면 다른 모든 세션은 쓰기 잠금이 해제되도록 을 기다립니다. 이 응용 프로그램에 심각한 문제가된다 경우 안전한 트랜잭션 테이블에 테이블의 일부를 변환 을 고려해야합니다.

+0

MySQL은 트랜잭션 및 비 트랜잭션 엔진을 지원합니다. 개별 엔진은 자체 버전 관리 메커니즘을 사용합니다 (엔진이있는 경우). OP가 트랜잭션 엔진을 사용한다면, 당신이 설명했던 것을 할 수 있습니다. – MarkR

0

원하는만큼 천천히 그림자 테이블에 데이터를로드 할 수 있습니다 후 즉시 RENAME TABLE을 그림자와 실제를 교환 :

truncate table shadow;  # make sure it is clean to start with 
insert into shadow .....; # lots of inserts etc against shadow table 
rename table active to temp, shadow to active, temp to shadow; 
truncate table shadow;  # throw away the old active data 

이름 바꾸기 문 원자이다. 중간 이름 인 "temp"는 temp와 active의 이름을 바꾸는 데 사용됩니다.

모든 저장소 엔진에서 작동합니다.

관련 문제