MySQL InnoDB: 'FOR UPDATE'와 'LOCK IN SHARE MODE'의 차이점
두 개의 잠금 판독 절 사이의 정확한 차이는 무엇입니까?
SELECT ... FOR UPDATE
그리고.
SELECT ... LOCK IN SHARE MODE
그리고 왜 하나를 다른 하나보다 더 사용해야 합니까?
저는 그 둘 사이의 차이점을 이해하려고 노력해 왔습니다.다음 사람에게 도움이 되기를 바라며 제가 찾은 것을 문서화하겠습니다.
둘다요.LOCK IN SHARE MODE
그리고.FOR UPDATE
다른 트랜잭션이 선택한 행을 업데이트할 수 없는지 확인합니다.두 가지 차이점은 데이터를 읽는 동안 잠금을 처리하는 방법에 있습니다.
LOCK IN SHARE MODE
다른 트랜잭션이 잠긴 동일한 행을 읽는 것을 방지하지 않습니다.
FOR UPDATE
동일한 행의 다른 잠금 판독을 방지합니다(비잠금 판독은 여전히 해당 행을 읽을 수 있음).LOCK IN SHARE MODE
그리고.FOR UPDATE
읽기 잠금).
이것은 카운터 업데이트와 같은 경우에 중요합니다. 한 문에서 값을 읽고 다른 문에서 값을 업데이트합니다.여기서 사용LOCK IN SHARE MODE
두 트랜잭션이 동일한 초기 값을 읽을 수 있습니다.따라서 두 트랜잭션 모두 카운터가 1씩 증가한 경우 두 트랜잭션 모두 처음에 동일한 값을 읽었기 때문에 종료 카운트는 1만 증가할 수 있습니다.
사용.FOR UPDATE
첫 번째 트랜잭션이 완료될 때까지 두 번째 트랜잭션이 값을 읽지 못하도록 잠글 수 있습니다.이렇게 하면 카운터가 2개씩 증가합니다.
업데이트의 경우 --- 선택한 행을 다음 단계(이 트랜잭션이 종료되기 전)에 업데이트할 수 있으므로 mysql이 현재 동일한 행 집합에 대한 읽기 잠금을 다른 트랜잭션에 부여하지 않습니다.다른 트랜잭션(읽기/쓰기 여부에 관계없이)은 첫 번째 트랜잭션이 완료될 때까지 기다려야 합니다.
공유의 경우 - 테이블에서 행을 선택하는 것은 읽기 전용이며 트랜잭션 종료 전에는 수정하지 않음을 Mysql에 나타냅니다.행의 읽기 잠금에 액세스할 수 있는 트랜잭션 수는 제한되지 않습니다.
참고: 이 문(업데이트용, 공유용)을 제대로 사용하지 않으면 교착 상태에 빠질 가능성이 있습니다.
어느 쪽이든 데이터의 무결성이 보장될 것입니다. 데이터베이스가 어떻게 보장하는지에 대한 문제일 뿐입니다.트랜잭션이 서로 충돌할 때 런타임 오류를 발생시킴으로써(예: 공유), 또는 서로 충돌할 수 있는 트랜잭션을 직렬화함으로써(예: 업데이트) 그렇게 합니까?
공유용(공유 모드에서 잠금):트랜잭션은 업데이트 문을 수신하는 순간(모든 다시 잠금이 해제될 때까지 차단하거나 다른 쓰기가 진행 중인 경우 교착 상태로 인해 실패함)까지 차단을 지연하기 때문에 교착 상태로 인해 실패할 확률이 높습니다.그러나 하나의 클라이언트만 차단하고 결국 성공합니다. 다른 클라이언트는 업데이트를 시도하면 교착 상태로 실패하므로 둘 중 하나만 성공하고 나머지는 트랜잭션을 다시 시도해야 합니다.
업데이트를 위해: 트랜잭션은 동시에 실행할 수 없기 때문에 교착 상태로 인해 실패하지 않습니다.예를 들어, 모든 업데이트가 모든 클라이언트에서 직렬화된 경우 멀티스레드에 대한 추론을 쉽게 할 수 있기 때문에 이 방법이 바람직할 수 있습니다.그러나 첫 번째 트랜잭션이 완료될 때까지 다른 모든 트랜잭션이 차단되므로 동시에 수행할 수 있는 작업이 제한됩니다.
Pro-Tip: 이 동작을 직접 증명하기 위해 로컬 테스트 데이터베이스와 명령줄에서 몇 개의 mysql 클라이언트를 사용하는 것이 좋습니다.그것이 제가 결국 그 차이를 이해하는 방법입니다. 왜냐하면 그것은 여러분이 그것을 행동으로 볼 때까지 매우 추상적일 수 있기 때문입니다.
언급URL : https://stackoverflow.com/questions/32827650/mysql-innodb-difference-between-for-update-and-lock-in-share-mode
'programing' 카테고리의 다른 글
MySQL 성능 - "IN" 절 vs.단일 값에 대해 동일(=) (0) | 2023.07.23 |
---|---|
sqlalchemy 필터여러 열 (0) | 2023.07.23 |
MariaDB의 IN 문에 잘못된 결과가 있습니까? (0) | 2023.07.23 |
두 개의 서로 다른 쿼리를 하나의 결과로 오라클 SQL로 출력 (0) | 2023.07.23 |
다른 컴파일러에서 MSVC의 _count of와 동등합니까? (0) | 2023.07.23 |