2011-04-08 5 views

답변

1

교착 상태로 인해 리소스를 통한 충돌로 인해 쿼리가 실행되지 않습니다. 교착 상태를 처리하는 데이터베이스 엔진의 유일한 일반적인 방법은 교착 상태에있는 프로세스 중 하나를 종료하고 가능한 경우 다시 실행하는 것입니다.

예, 엔진이 교착 상태를 감지하고 처리해야하므로 성능 문제가 발생합니다. 일반적으로 가능한 교착 상태를 피하는 것이 좋습니다. 당신이 교착 상태 롤백됩니다 관련된 거래 중 하나를 얻을 때

많은 정보 여기 http://dev.mysql.com/doc/refman/5.0/en/innodb-deadlocks.html

+0

InnoDB는 트랜잭션을 자동으로 재실행하지 않고 응용 프로그램에 오류를 반환합니다. 응용 프로그램 자체를 다시 시도해야합니다. – MarkR

1

있습니다. 트랜잭션을 롤백하는 것은 서버에 비해 상대적으로 비용이 많이 들고 실제 작업에 소비하는 노력을 소비합니다. 또한 원래 트랜잭션을 다시 수행해야합니다.

그러나 응용 프로그램에 매우 적은 수의 교착 상태가있는 것을 목표로해야합니다. 트랜잭션의 1 %가 교착 상태 인 경우 너무 많을 수 있습니다.

다행스럽게도 InnoDB의 디자이너는 교착 상태가 잠재적 인 성능 문제 였음을 알고 "InnoDB"트랜잭션을 "적은 작업"을 수행하는 트랜잭션으로 롤백하려고했습니다. 트랜잭션이 시작된 이래 적은 작업을 수행 한 경우 롤백됩니다. 따라서 한 트랜잭션이 백만 개의 삽입을 수행하고 다른 트랜잭션이 하나만 완료 한 경우 한 삽입 트랜잭션은 롤백 될 수 있습니다.

InnoDB는 대규모 트랜잭션을 롤백 할 때 효율성이 떨어집니다. 한 시스템에서 나는 트랜잭션이 롤백하는 데 45 분이 걸리는 것을 보았습니다.

일반적으로 말해서 많은 교착 상태가 발생하는 경우 응용 프로그램 디자인 문제로 인한 것일 수 있습니다. 예를 들어 거대한 업데이트 쿼리를 정기적으로 수행하는 경우 데이터베이스가 정규화되지 않았 음을 나타낼 수 있습니다 (예를 들어).

관련 문제