MySQL :테이블 업데이트시 읽기 방지
1 분마다 테이블을 비우고 새 데이터로 채 웁니다. 이제 사용자가 채우기 프로세스 중에 데이터를 읽지 않아도되기를 바랍니다.
어떻게해야합니까? 트랜잭션이 방법입니까?
MySQL :테이블 업데이트시 읽기 방지
1 분마다 테이블을 비우고 새 데이터로 채 웁니다. 이제 사용자가 채우기 프로세스 중에 데이터를 읽지 않아도되기를 바랍니다.
어떻게해야합니까? 트랜잭션이 방법입니까?
트랜잭션 엔진 (일반적으로 Innodb)을 사용한다고 가정하면 동일한 트랜잭션에서 테이블을 지우고 다시 채 웁니다.
은 당신의 독자가 READ_COMMITTED 이상의 트랜잭션 격리 수준 (기본값은 높다 REPEATABLE READ입니다)을 사용하는 것이 있는지 확인하십시오.그런 식으로 독자는 업데이트 도중 테이블의 이전 내용을 계속 읽을 수 있습니다.
이 조심해야 할 몇 가지가 있습니다 : 테이블이 롤백 영역을 소모 너무 큰 경우
당신은 당신의 작업을 수행하는 동안 테이블을 LOCK
수 있습니다
http://dev.mysql.com/doc/refman/5.1/en/lock-tables.html
(존재하는 경우, 실제로 나) 내가 MySQL의 내부 행 버전 메커니즘에 대해 충분히 모르겠지만, 다른 데이터베이스 (오라클, PostgreSQL을, 그리고 더 최근에, SQL Server가) 많이 투자 한테이블 잠금 부적절한 읽거나 다른 세션이 기록만을 보호합니다. 잠금을 보유하고있는 세션은 읽기 잠금조차도 테이블 수준 작업 (DROP TABLE 등)을 수행 할 수 있습니다. 자르기 작업은 트랜잭션 보안이 아니므로 활성 트랜잭션 또는 테이블 잠금을 유지하는 동안 세션이 세션을 시도하면 오류가 발생합니다.
작성자가 이 아닌 독자를 차단하도록하기위한 노력의 일환으로, 독자는 갱신/쓰기 프로세스가 시작되기 직전의 행 버전에 액세스 할 수 있습니다. 업데이트가 커밋되면 해당 행의 버전이 모든 독자에게 제공되는 버전이되어 MySql의 위 동작에서 소개 할 병목 현상을 피할 수 있습니다.
이 정책은 테이블 잠금 이 교착 상태가 없음을 보장합니다. 그러나, 다른 것들 당신은이 정책에 대한 알고있을 필요가있다 : 당신이 테이블에 대한 LOW_PRIORITY 쓰기 잠금을 사용하는 경우, 만 다른이 될 때까지 MySQL은 이 특정 잠금을 기다리는 것을 의미한다 READ 잠금을 원하는 세션 세션이 WRITE 잠금을 받았고 잠금 테이블 목록의 다음 테이블에 대해 잠금을 얻으려고 대기 중이면 다른 모든 세션은 쓰기 잠금이 해제되도록 을 기다립니다. 이 응용 프로그램에 심각한 문제가된다 경우 안전한 트랜잭션 테이블에 테이블의 일부를 변환 을 고려해야합니다.
원하는만큼 천천히 그림자 테이블에 데이터를로드 할 수 있습니다 후 즉시 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의 이름을 바꾸는 데 사용됩니다.
모든 저장소 엔진에서 작동합니다.
MySQL은 트랜잭션 및 비 트랜잭션 엔진을 지원합니다. 개별 엔진은 자체 버전 관리 메커니즘을 사용합니다 (엔진이있는 경우). OP가 트랜잭션 엔진을 사용한다면, 당신이 설명했던 것을 할 수 있습니다. – MarkR