MySQL의 필드 증가는 원자적입니까?
표준 MyISAM 테이블에 카운터를 추가하고 싶은 웹 사이트를 만들고 있습니다.
단순화된 예:
UPDATE votes SET num = num + 1;
여러 연결이 동일한 쿼리를 수행하는 경우 문제가 발생합니까? 아니면 MySQL이 쿼리를 처리하고 테이블을 잠그거나 충돌이 없는지 확인합니다.
쓰기는 원자적이지만 증분에는 읽기도 필요합니다.따라서 문제는 읽기가 안전한지 여부입니다. 즉, 증분을 수행하는 다른 스레드가 동일한 값으로 증가하지 않을 것이라고 확신하십니까?의심이 갑니다.100% 정확한 방법은 다음과 같습니다.
-- begin transaction here
select counter from myCounters where counter_id = 1 FOR UPDATE;
-- now the row is locked and nobody can read or modify its values
update myCounters set counter = ? where id = 1;
-- set ? to counter + 1 programmatically
commit; -- and unlock...
내 ISAM 테이블은 테이블 수준 잠금을 사용합니다.즉, 업데이트 쿼리를 실행하는 동안 전체 테이블이 잠깁니다.단순화된 사용 사례에 대한 답은 다음과 같습니다. 예, 이것은 스레드 세이프입니다.그러나 다른 스토리지 엔진을 사용하거나 업데이트에 여러 테이블이 포함된 경우에는 그렇지 않을 수 있습니다.
다음은 MySQL 설명서의 인용문입니다.
테이블 잠금을 사용하면 여러 세션을 테이블에서 동시에 읽을 수 있지만 세션이 테이블에 쓰려면 먼저 해당 세션에 대한 전용 액세스 권한을 얻어야 합니다.업데이트하는 동안 이 특정 테이블에 액세스하려는 다른 모든 세션은 업데이트가 완료될 때까지 기다려야 합니다.
설계에 적합한 경우 자동 증분 열, 트랜잭션 또는 외부 동기화를 사용할 수도 있습니다.
건배!
예, 업데이트 쿼리를 실행하면 테이블(또는 InnoDB 형식 데이터베이스의 행)이 자동으로 잠깁니다.
이 형식의UPDATE
원자력입니다.다른 형태의UPDATE
와의 트랜잭션을 사용하여 원자로 만들 수 있습니다.SELECT ... FOR UPDATE
.
쿼리가 더 복잡했지만 동일한 문제가 발생했습니다.
UPDATE CLB_SYNC_T SET PENDING_MESSAGES = PENDING_MESSAGES + ? WHERE USER_ID = ?
MyISAM을 기본 엔진으로 사용하는 것은 도움이 되지 않았기 때문에 SELECT FOR UPDATE 사용을 위해 되돌아봅니다.
업데이트를 위한 선택(SELECT FOR UPDATE)을 통해 MySQL이 전체 테이블을 잠그지 않았기 때문에 행 업데이트를 위해 성능이 최대 10배 향상되었습니다.
InnoDB를 사용할 때의 또 다른 방법은 다음과 같이 여러 열의 고유 인덱스를 사용하는 것입니다.
테이블 'sessions' {unique_key(browser_session_id,profile_id) // 세션당 하나의 항목 삽입이 }회 수행되도록 보장합니다.
세션에서 개수(browser_session_id) 선택
사용자당 여러 세션이 허용되지 않으므로 고유한 세션의 결과를 보장합니다.
결론들
장점
각 삽입에는 사전 선택이 필요합니다.
단점
모든 경우에 적합한 것은 아닙니다.
쓰기 성능이 느려지고 추가 관리가 필요할 수 있음
언급URL : https://stackoverflow.com/questions/4358732/is-incrementing-a-field-in-mysql-atomic
'programing' 카테고리의 다른 글
mysql 비교에 적합한 루비 날짜 시간 (0) | 2023.07.22 |
---|---|
C에서 "signed int"가 "unsigned int"보다 빠른 이유는 무엇입니까? (0) | 2023.07.22 |
긴 16진수 문자열에서 파이썬 바이트 개체를 만드는 방법은 무엇입니까? (0) | 2023.07.22 |
Python에서 길이가 같은 여러 개의 목록 인터리브 (0) | 2023.07.22 |
대응 라우터 및 스프링 부트 컨트롤러로 작업하는 방법 (0) | 2023.07.22 |