2012-07-09 1 views
1

두 명의 사용자가 동일한 대상 테이블에서 동시에 INSERT INTO 문을 실행하는 경우 이들이 병렬로 또는 순차적으로 실행됩니까?관계형 데이터베이스가 insert 문을 병렬로 또는 순차적으로 실행합니까?

이 동작은 대상 테이블에 기본 키가 있는지 여부에 따라 변경됩니까?

이것은 모든 관계형 데이터베이스에 대해 정의 된 규칙입니까? 아니면 다른 공급 업체가이 방식을 다른 방식으로 구현합니까?

답변

2

일반적으로은 기본 키가 정의 된 경우에도 병렬로 실행되어야합니다.

이 동작은 주로 DBMS에 따라 다릅니다. MyISAM을 가진 MySQL은 예를 들어. DML이 테이블에 대해 실행중인 경우 테이블에 대한 모든 추가 액세스를 차단합니다. 기본 설치 및 이전 버전의 SQL Server에서도 마찬가지입니다. 일반적으로

DBMS에이 MVCC은 (오라클, PostgreSQL을가, 파이어 버드, MySQL은/​​이노, ...)이 다음 블록 동시 삽입이 있음을 삽입 병렬

한 가지에서 실행 기대할 수 있습니다 사용하는 경우 두 트랜잭션이 동일한 기본 키 값을 삽입하는 경우 이 경우 두 번째 트랜잭션은 첫 번째 트랜잭션이 커밋 (두 번째 트랜잭션은 pk 위반 오류) 또는 롤백 (두 번째 트랜잭션 성공)을 기다려야합니다.

+0

보다 복잡 할 수 있습니다. 기본 키는 직렬화를 적용 할 수있는 단 하나의 인스턴스입니다. Identity/자동 증가 열, 고유 제한 조건 (기본 키는 예제 임) 및 트리거는 다른 상황입니다. –

+0

@ GordonLinoff : 트리거가 수동으로 트리거 코드에서 수행되지 않는 한 트리거는 삽입을 직렬화하지 않습니다. 식별 열에 대한 흥미로운 점. 이는 identity/auto_increment 개념의 단점입니까 아니면 기본 인덱스의 결과입니까? (기본적으로 다시 고유 인덱스 인 "문제"입니다). 주로 Oracle과 PostgreSQL을 사용하며 시퀀스에는 동시성 문제가 없습니다. –