DBI를 통해 연결하는 병렬 Perl 프로세스에 의해 작은 방식으로 지속적으로 업데이트되는 약 5,000,000 개의 행이있는 MySQL 테이블이 있습니다. 이 테이블에는 약 10 개의 열과 여러 개의 인덱스가 있습니다.MySQL 오류 "잠금을 시도 할 때 교착 상태가 발견되어 트랜잭션을 다시 시작하십시오."
UPDATE file_table SET a_lock = 'process-1234' WHERE param1 = 'X' AND param2 = 'Y' AND param3 = 'Z' LIMIT 47
이 오류 만 가끔 트리거 :
DBD::mysql::st execute failed: Deadlock found when trying to get lock; try restarting transaction at Db.pm line 276.
오류를 트리거 SQL 문이 같은 것입니다 :
한 매우 일반적인 작업은 종종 다음과 같은 오류를 일으킨다. 나는 1 % 이하의 전화로 추정한다. 그러나 작은 테이블을 사용한 적이 없었고 데이터베이스가 커짐에 따라 점점 더 보편화되었습니다.
file_table의 a_lock 필드를 사용하여 실행중인 거의 동일한 네 개의 프로세스가 동일한 행에서 작동하지 않도록주의하십시오. 이 제한은 작업을 작은 덩어리로 나누기 위해 고안되었습니다.
MySQL 또는 DBD :: mysql에 대한 튜닝을 많이하지 않았습니다. MySQL은 표준 솔라리스 배포하고, 다음과 같이 데이터베이스 연결이 설정됩니다 : 나는 여러 다른 사람들이 유사한 오류를보고 있고 이것이 진정한 교착 상태가 될 수 있음을 온라인으로 보았다
my $dsn = "DBI:mysql:database=" . $DbConfig::database . ";host=${DbConfig::hostname};port=${DbConfig::port}";
my $dbh = DBI->connect($dsn, $DbConfig::username, $DbConfig::password, { RaiseError => 1, AutoCommit => 1 }) or die $DBI::errstr;
.
나는 두 가지 질문이 있습니다
정확히 어떤 내 상황이 위의 오류를 일으키는 대해?
주파수를 줄이거 나 줄일 수있는 간단한 방법이 있습니까? 예를 들어, "Db.pm 라인 276에서 트랜잭션 재시작"에 대해 정확히 어떻게해야합니까?
미리 감사드립니다.
그때 우리가 잡을 필요가 오류 코드는 무엇입니까? 1205만으로도 충분합니까? http://dev.mysql.com/doc/refman/5.7/en/error-messages-server.html에는 900 개 이상의 오류 코드가 있습니다. 귀하의 시도/포획 제안을위한 적절한 솔루션을 구현하기 위해 우리가 알아야 할 모든 코드를 어떻게 알 수 있습니까? – Pacerier
InnoDB 또는 행 수준의 트랜잭션 RDBMS 이외의 다른 것이 이러한 문제점을 가지고 있지 않음을 의미합니까? –