우리는 MySQL과 트랜잭션에 대해 이야기하고 있기 때문에, 대부분의 트랜잭션은 InnoDB에 관한 것이지만, 대부분의 트랜잭션은 저장소 엔진에 유효합니다.
트랜잭션 잠금은 스토리지 엔진과 transaction isolation level에 따라 다릅니다. MySQL/InnoDB는 트랜잭션을 구현하기 위해 행 버전 관리를 사용하고 직렬화를 제외한 모든 격리 수준에서 사용되는 잠금 수를 줄입니다. MySQL의 기본 격리 수준은 반복 읽기입니다.
일반적으로 업데이트는 쓰기 잠금을 사용합니다. 즉, 다른 트랜잭션이 동일한 행을 업데이트 할 수는 없지만 읽을 수는 있습니다. 잠긴 행에 액세스하려고하면 MySQL은 잠금 대기 시간 초과에 도달 할 때까지 기다린 다음 쿼리를 중단하고 잠금 대기 시간 초과에 도달했음을 알립니다. 보통 이런 일은 없어야합니다. , dead-locks
을 소개하지만 트랜잭션을 사용에서 가장 위험 부분 - transaction A
업데이트 record1
및 transaction B
의해 잠겨 record2
업데이트하려고 할 때 - record2
를 업데이트 한 transaction B
및 record1
를 업데이트하려고하지만, record1
는 A
의해 잠겨, 그래서 모두 대기에 대한 서로.
일반적인 조언은 트랜잭션을 가능한 작게 유지하고 교착 상태를 방지하기 위해 가능한 한 빨리 업데이트 할 행을 잠그는 것입니다 (이 경우 업데이트를 위해 선택 ...을 사용할 수 있음).
많은 정보는 MySQL documentation과 MySQL 인증 가이드에서 찾을 수 있습니다.
MyISAM은 트랜잭션을 지원하지 않으며, 테이블 수준과 행 수준의 잠금은 트랜잭션 잠금과 정확히 일치하지 않으며 저장소 엔진에 구현 된 잠금 기능입니다. –