>데이터 베이스 >MySQL 튜토리얼 >잠금 없이 MySQL에서 SELECT 문을 실행하는 방법은 무엇입니까?

잠금 없이 MySQL에서 SELECT 문을 실행하는 방법은 무엇입니까?

DDD
DDD원래의
2024-12-14 18:33:12400검색

How to Run SELECT Statements in MySQL Without Locking?

MySQL에서 잠금을 유발하지 않고 SELECT 문을 실행하는 방법

MySQL에서 SELECT 문을 실행하면 잠금이 발생할 수 있으며, 특히 기본 테이블이 동시수정중입니다. 이는 특히 binlogging에 의존하는 슬레이브 데이터베이스에서 문제가 될 수 있습니다.

제공된 문서에서 제안된 한 가지 잠재적인 해결책은 "NOLOCK" 수정자를 활용하는 것입니다. 그러나 MySQL은 동등한 키워드를 지원하지 않습니다. 대신 트랜잭션 격리 수준을 조정하여 동일한 효과를 얻을 수 있습니다.

해결책: 커밋되지 않은 트랜잭션 격리 수준 읽기

SELECT 문을 실행하는 동안 잠금을 방지하려면 다음을 수행할 수 있습니다. 트랜잭션 격리 수준을 "READ UNCOMMITTED"로 설정합니다. 이를 통해 커밋되지 않은 트랜잭션을 볼 수 있어 잠금이 발생하는 것을 방지할 수 있습니다. 방법은 다음과 같습니다.

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT COUNT(online.account_id) cnt from online;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

슬레이브 데이터베이스 호환성

슬레이브 데이터베이스에서 READ UNCOMMITTED 격리 수준을 사용할 때 다음 오류가 발생할 수 있습니다. 로깅이 불가능합니다...InnoDB의 트랜잭션 수준 'READ-UNCOMMITTED'는 binlog 모드 'STATEMENT'에 대해 안전하지 않습니다." 이 문제를 해결하려면 마스터 데이터베이스의 my.cnf 파일을 수정하여 binlogging에 대한 "READ UNCOMMITTED" 트랜잭션 격리 수준을 활성화할 수 있습니다.

대체 솔루션

또는, 격리 수준을 설정하는 대신 다음 기술을 사용할 수 있습니다.

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT COUNT(online.account_id) cnt from online;
COMMIT;

이렇게 하면 쿼리가 다음과 같이 강제됩니다. 커밋되지 않은 데이터를 읽은 다음 즉시 트랜잭션을 커밋하여 잠재적인 잠금이나 충돌을 방지합니다.

커밋되지 않은 데이터 읽기 격리 수준을 사용하면 커밋되지 않은 데이터에 액세스할 수 있으므로 데이터 불일치가 발생할 수 있습니다. 잠재적인 위험을 고려하고 필요한 경우 신중하게 사용하는 것이 중요합니다.

위 내용은 잠금 없이 MySQL에서 SELECT 문을 실행하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.