질문:
SELECT COUNT(online.account_id) cnt from online;
그러나 온라인 테이블도 이벤트에 의해 수정되므로 자주 실행하여 lock을 볼 수 있습니다 show processlist
.
MySQL에서 select 문으로 인해 잠금이 발생하지 않도록하는 문법이 있습니까?
그리고 위에서 MySQL 슬레이브 데이터베이스에 있다는 것을 잊어 버렸습니다.
my.cnf:transaction-isolation = READ-UNCOMMITTED
슬레이브에 추가하면 오류가 발생합니다.
오류 ‘이진 로깅이 불가능합니다. 메시지 : InnoDB의 트랜잭션 레벨 ‘READ-UNCOMMITTED’는 쿼리의 binlog 모드 ‘STATEMENT’에 안전하지 않습니다.
그렇다면 호환 가능한 방법이 있습니까?
답변
“MYSQL WITH NOLOCK”이라는 제목의 기사를 찾았습니다.
https://web.archive.org/web/20100814144042/http://sqldba.org/articles/22-mysql-with-nolock.aspx
MS SQL Server에서는 다음을 수행합니다.
SELECT * FROM TABLE_NAME WITH (nolock)
MYSQL에 해당하는 것은
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT * FROM TABLE_NAME ;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ;
편집하다
Michael Mior 는 (의견에서) 다음을 제안했습니다.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT * FROM TABLE_NAME ;
COMMIT ;
답변
테이블이 InnoDB 인 경우 http://dev.mysql.com/doc/refman/5.1/en/innodb-consistent-read.html을 참조 하십시오. SELECT에 대해 일관된 읽기 (비 잠금 모드)를 사용합니다. innodb_locks_unsafe_for_binlog 옵션이 설정되고 트랜잭션의 격리 레벨이 SERIALIZABLE로 설정되지 않은 경우 FOR UPDATE 또는 LOCK IN SHARE MODE를 지정하지 마십시오. 따라서 선택된 테이블에서 읽은 행에 잠금이 설정되지 않습니다 “.
답변
답변
MySQL 매뉴얼 의이 페이지 를 읽을 수 있습니다 . 테이블이 잠기는 방법은 테이블 유형에 따라 다릅니다.
MyISAM은 테이블 잠금을 사용하여 매우 빠른 읽기 속도를 달성하지만 UPDATE 문이 대기중인 경우 향후 SELECTS가 UPDATE 뒤에 대기합니다.
InnoDB 테이블은 행 수준 잠금을 사용하므로 UPDATE 뒤에 전체 테이블이 잠기지 않습니다. InnoDB와 관련된 다른 종류의 잠금 문제가 있지만 필요에 맞게 찾을 수 있습니다.
답변
테이블 유형에 따라 잠금은 다르게 수행되지만 SELECT 횟수도 달라집니다. MyISAM 테이블의 경우 간단한 SELECT count (*) FROM 테이블은 메타 데이터에 액세스하여 레코드 수를 가져 오기 때문에 테이블을 잠그면 안됩니다. Innodb는 레코드를 계산하기 위해 스냅 샷에서 테이블을 가져와야하므로 시간이 오래 걸리지 만 잠금이 발생하지는 않습니다.
적어도 synchronize_insert가 1 (기본값)로 설정되어 있어야합니다. 그런 다음 테이블에 채울 데이터 파일에 “갭”이 없으면 삽입이 파일에 추가되고 SELECT 및 INSERT가 MyISAM 테이블과 동시에 발생할 수 있습니다. 레코드를 삭제하면 데이터 파일에 “갭”이 생겨 향후 삽입 및 업데이트로 채워집니다.
레코드를 거의 삭제하지 않으면 동시 _ 삽입을 2로 설정할 수 있으며 삽입은 항상 데이터 파일 끝에 추가됩니다. 그러면 선택 및 삽입이 동시에 발생할 수 있지만 삭제하는 레코드 수에 관계없이 데이터 파일은 더 작아지지 않습니다 (모든 레코드 제외).
결론적으로, 테이블에 많은 업데이트, 삽입 및 선택이있는 경우 InnoDB로 만들어야합니다. 시스템에서 테이블 유형을 자유롭게 혼합 할 수 있습니다.
답변
mysql에서 더티 읽기를 활성화하는 또 다른 방법은 힌트 추가입니다. LOCK IN SHARE MODE
SELECT * FROM TABLE_NAME LOCK IN SHARE MODE;
답변
에서 이 참조 :
LOCK TABLES를 사용하여 테이블 잠금을 명시 적으로 확보 한 경우 테이블을 잠근 상태에서 다른 세션이 동시 삽입을 수행 할 수 있도록 READ 잠금 대신 READ LOCAL 잠금을 요청할 수 있습니다.
