2014-01-21 3 views
0

MYSQL을 통해 innoDB 데이터베이스 엔진을 사용하고 있습니다. 서로의 밀리 초 내에 여러 트랜잭션이 발생하면 데이터베이스가 트랜잭션을 어떻게 실행합니까? 다음 트랜잭션을 실행하기 전에 한 번에 하나의 트랜잭션 만 허용하고 지연합니까?MYSQL은 어떻게 쿼리의 우선 순위를 결정합니까?

+0

단일 사용자 스레드는 MySQL에서 동기식입니다. 병행 동작의 경우 '태블릿'이 있습니다. – BlitZ

+0

주제를 벗어나지 만 오히려 의견을 기반으로합니다. – EJP

+0

글쎄 InnoDB는 로우 레벨 잠금을 지원하기 때문에 한 테이블의 다른 로우에 대한 변경은 사실상 동시에 (또는 그 밀리 초 이내에) 이루어질 수있다. – spaceman

답변

1

별도의 연결은 트랜잭션이 동시에 실행될 수 있습니다. 트랜잭션이 진행됨에 따라 다양한 잠금 (mutex)이 획득됩니다. 어떤 경우 (동일한 행을 업데이트하는 두 개의 연결) 잠금은 다른 트랜잭션이 완료 될 때까지 하나의 트랜잭션을 차단합니다. 경우에 따라 "교착 상태"가 발생하고 하나의 트랜잭션이 롤백됩니다. 또 다른 경우에는 하나의 트랜잭션이 잠금을 기다리는 시간 초과가 발생합니다. (기본 시간은 50 초이며 거의 볼 수는 없습니다.)

잠금은 어떤 트랜잭션도 다른 트랜잭션을 방해하지 않고 트랜잭션을 "동시에"실행하도록 설계되었습니다.

0

InnoDB에서 모든 사용자 활동은 트랜잭션 내에서 발생합니다.

자동 커밋 모드이 활성화 된 경우 각 SQL 문은 하나의 트랜잭션을 자체적으로 형성합니다. 기본적으로 MySQL은 자동 연결이 활성화 된 상태에서 새로운 연결마다 세션을 시작하므로 MySQL은 각 명령문이 오류를 반환하지 않으면 커밋을 수행합니다. 명령문이 오류를 반환하면 커밋 또는 롤백 동작은 오류에 따라 다릅니다.

자동 커밋이 활성화 된 세션은 명시 적 START TRANSACTION 또는 BEGIN 문으로 시작하고 COMMIT 또는 ROLLBACK 문을 사용하여 종료함으로써 다중 명령문 트랜잭션을 수행 할 수 있습니다.

SET autocommit = 0 인 세션에서 자동 커밋 모드가 비활성화 된 경우 세션은 항상 트랜잭션을 엽니 다. COMMIT 또는 ROLLBACK 문은 현재 트랜잭션을 종료하고 새 트랜잭션이 시작됩니다. 오픈. COMMIT 또는 ROLLBACK 문은 현재 트랜잭션을 종료하고 새 트랜잭션이 시작됩니다.

자세히 알아보기 - http://dev.mysql.com/doc/refman/5.0/en/innodb-transaction-model.html

관련 문제