2012-01-30 6 views
4

InnoDB 데이터베이스와 함께 mysql을 사용하고 있습니다.MySQL - Locking - InnoDB

모든 트랜잭션이 삽입 및 선택 (업데이트 없음) 인 경우 SQL 교착 상태에 대해 걱정할 필요가 없다고 가정합니다.

교착 상태가 발생할 수있는 시나리오를 볼 수 없습니다. 삽입물과 선택 만하면 교착 상태가 발생할 수 없다고 가정합니다.

관련되지 않을 수 있지만, 모든 트랜잭션은 PDO

당신은 여전히 ​​SQL의 교착 상태에 대해 걱정할 필요가
+1

'INSERT ... VALUE ...', 'INSERT ... SELECT ...'와 같이 다른 INSERT 문이 있습니다. 둘 다 사용하거나 첫 번째 변형 만 사용합니까? –

+0

'INSERT ... ON DUPLICATE KEY UPDATE'도 있습니다. 네가 그럴 필요가없는 것 같아. –

+0

그리고이 질문은 특정 트랜잭션 격리 수준에 관한 것입니까? 또는 일반적인 것 (모두에 대해)? –

답변

1

번호로 이루어집니다.

단일 행을 삽입하는 트랜잭션의 경우에도 교착 상태가 발생할 수 있습니다. 이는 삽입 조작이 실제로 원자가 아니며 잠금이 삽입 된 행의 (경우에 따라 여러) 색인 레코드에 자동으로 설정되기 때문입니다.

+0

'INSERT INTO ... VALUES' 문만 실행하면 교착 상태가 발생할 수 있습니까? 예를 들어 줄 수 있습니까? –

+0

이 경우에는 교착 상태가 발생할 수 있는지 여부와 관련이 없습니다. insert는 INSERT VALUE 또는 INSERT SELECT 등을 사용하는지 여부에 관계없이 인덱스의 일부를 잠글 수 있습니다. –

+0

모든 트랜잭션이 행이나 테이블 또는 인덱스를 잠글 수 있습니다. 그러나 서로 다른 유형의 트랜잭션은 서로 다른 유형의 잠금을 수행합니다. 이것은 교착 상태가 발생하는 방식과 관련이 있습니다. –

0

InnoDB MySQL 스토리지 엔진에는 로우 레벨 잠금이 있고 MyISAM MySQL 스토리지 엔진에는 테이블 레벨 잠금이 있습니다. MyISAM은 단순히 테이블 전체를 잠그고 트랜잭션을 지원하지 않기 때문에 데이터베이스 수준의 데드락을 가질 수 없습니다. 앱이 액세스하려는 테이블의 테이블 잠금에 앉아서 다른 앱을 잠글 수는 있지만 DB 수준의 '교착 상태'가 아니라 코드 오류입니다.

InnoDB는 트랜잭션을 지원하고 로우 레벨 잠금을 가지고 있기 때문에 db 레벨 교착 상태가 발생할 수 있습니다 (바쁜 시스템에서 가끔씩 발생할 수 있으므로 주변에서 코드를 작성해야합니다). MySQL이 "데드락 (deadlocks)"이라고 부르는 것 중 많은 부분이 느린 UPDATE로 인해 다른 쿼리가 행 잠금에 시간 초과되는 결과 인 것처럼 "진정한 교착 상태"가 아닙니다.