2012-01-21 4 views
0

MySQL에서 Dead Lock 오류가 발생하는 코드 섹션이 있습니다. 기본적으로 필드를 가져 오기 위해 select를하고 있는데, 해당 필드에 따라 같은 레코드의 카운터를 증가 시키거나 다른 필드를 삽입합니다. 이 코드는 여러 다른 시스템에서 호출됩니다. 여기 MySQL 교착 상태 문제 (PHP/MYSQL)

내가 뭐하는 거지의 일부 스크랩입니다 : (PHP/ZendFramework/MySQL을)

$db = $dbMgr->GetConnection(); // gets a connection & starts transaction 

// get a count field from the database... 
$result = $db->query("SELECT status_id,status,count FROM status WHERE company_id={$companyId} AND probe_id={$probeId} AND host_id={$hostId} ORDER BY timestamp DESC LIMIT 1;"); 

// do some stuff with the data.. maybe there is no current record, modify to use insert logic below 

// only process if we have a command 
if ($newStatus != $lastStatus) { 
    $record = array(); 
    $record["status"] = $newStatus; 
    $record["count"] = 1; 
    $db->insert('status', $record); // INSERT THE RECORD 
    $statusId = $db->lastInsertId(); 
} else { 
    $db->query("UPDATE status SET count=count+1,last_updated=".time()." WHERE status_id={$lastRecord} LIMIT 1;"); // UPDATE THE RECORD 
    $statusId = $lastRecord; 
} 

$dbMgr->commit(); // commits on success, rolls back on failure 
[편집]이 도움이 될 수 있다는 생각

:

------------------------ 
LATEST DETECTED DEADLOCK 
------------------------ 
120121 16:12:02 
*** (1) TRANSACTION: 
TRANSACTION A42EF1D, ACTIVE 0 sec, process no 30952, OS thread id 1234467136 starting index read 
mysql tables in use 1, locked 1 
LOCK WAIT 3 lock struct(s), heap size 1248, 39 row lock(s) 
MySQL thread id 77901288, query id 705153914 ip-10-36-78-178.ec2.internal 10.36.78.178 root Sending data 
SELECT qid,command,content_url,nextrundate,locked_until,data FROM items WHERE command='NOTIFY' AND status='PENDING' AND nextrundate <= 1327162322 AND 1327162322 > locked_until ORDER BY nextrundate LIMIT 150 FOR UPDATE 
*** (1) WAITING FOR THIS LOCK TO BE GRANTED: 
RECORD LOCKS space id 404 page no 1223 n bits 232 index `PRIMARY` of table `queue`.`items` trx id A42EF1D lock_mode X locks rec but not gap waiting 
Record lock, heap no 159 PHYSICAL RECORD: n_fields 12; compact format; info bits 32 
0: len 8; hex 00000000006fe5c4; asc  o ;; 
1: len 6; hex 00000a42ef1a; asc B ;; 
2: len 7; hex 00000000390110; asc  9 ;; 
3: len 1; hex 81; asc ;; 
4: len 11; hex 50524f42455f4556454e54; asc PROBE_EVENT;; 
5: len 15; hex 352f3934302f3934302e70726f6265; asc 5/940/940.probe;; 
6: len 15; hex 50524f42455f4556454e545f393430; asc PROBE_EVENT_940;; 
7: len 4; hex 4f1ae3d1; asc O ;; 
8: len 8; hex 434f4d504c455445; asc COMPLETE;; 
9: len 4; hex 4f1ae40d; asc O ;; 
10: len 4; hex 4f1ae3d1; asc O ;; 
11: len 0; hex ; asc ;; 

*** (2) TRANSACTION: 
TRANSACTION A42EF1A, ACTIVE 0 sec, process no 30952, OS thread id 1241389376 updating or deleting 
mysql tables in use 1, locked 1 
4 lock struct(s), heap size 1248, 11 row lock(s), undo log entries 1 
MySQL thread id 77901285, query id 705153899 ip-10-190-211-216.ec2.internal 10.190.211.216 root updating 
DELETE FROM items where status = 'DELETED' OR status = 'COMPLETE' LIMIT 2500 
*** (2) HOLDS THE LOCK(S): 
RECORD LOCKS space id 404 page no 1223 n bits 232 index `PRIMARY` of table `queue`.`items` trx id A42EF1A lock_mode X locks rec but not gap 
Record lock, heap no 159 PHYSICAL RECORD: n_fields 12; compact format; info bits 32 
0: len 8; hex 00000000006fe5c4; asc  o ;; 
1: len 6; hex 00000a42ef1a; asc B ;; 
2: len 7; hex 00000000390110; asc  9 ;; 
3: len 1; hex 81; asc ;; 
4: len 11; hex 50524f42455f4556454e54; asc PROBE_EVENT;; 
5: len 15; hex 352f3934302f3934302e70726f6265; asc 5/940/940.probe;; 
6: len 15; hex 50524f42455f4556454e545f393430; asc PROBE_EVENT_940;; 
7: len 4; hex 4f1ae3d1; asc O ;; 
8: len 8; hex 434f4d504c455445; asc COMPLETE;; 
9: len 4; hex 4f1ae40d; asc O ;; 
10: len 4; hex 4f1ae3d1; asc O ;; 
11: len 0; hex ; asc ;; 

*** (2) WAITING FOR THIS LOCK TO BE GRANTED: 
RECORD LOCKS space id 404 page no 11287 n bits 280 index `comm.stat.next.locked` of table `queue`.`items` trx id A42EF1A lock_mode X locks rec but not gap waiting 
Record lock, heap no 181 PHYSICAL RECORD: n_fields 5; compact format; info bits 0 
0: len 11; hex 50524f42455f4556454e54; asc PROBE_EVENT;; 
1: len 8; hex 434f4d504c455445; asc COMPLETE;; 
2: len 4; hex 4f1ae3d1; asc O ;; 
3: len 4; hex 4f1ae40d; asc O ;; 
4: len 8; hex 00000000006fe5c4; asc  o ;; 

*** WE ROLL BACK TRANSACTION (1) 
------------ 
TRANSACTIONS 
------------ 
Trx id counter A42F0C1 
Purge done for trx's n:o < A42EF2E undo n:o < 0 
History list length 117 
LIST OF TRANSACTIONS FOR EACH SESSION: 
---TRANSACTION 0, not started, process no 30952, OS thread id 1241389376 
MySQL thread id 77901343, query id 705156010 ip-10-85-61-62.ec2.internal 10.85.61.62 root 
SHOW ENGINE INNODB STATUS 
---TRANSACTION A2A4783, not started, process no 30952, OS thread id 1100028224 
MySQL thread id 1, query id 705153376 localhost 127.0.0.1 rdsadmin 
+0

또 다른 비슷한 질문에 대한 누군가의 의견 "InnoDB는 동시 기록에 문제가 있습니다. 특히 당신이 innodb 테이블의 끝에 데이터를 삽입하는 경우"- 어떻게 다루고 있습니까? – MichaelICE

+1

교착 상태 보고서가 게시 한 SQL과 일치하지 않습니다. "items"라는 다른 테이블에서 교착 상태를보고합니다. – schtever

+0

더 정확한 데이터를 캡처 할 수 있는지 확인합니다 – MichaelICE

답변

0

을 더 깊이 파고 후 문제 표면에 ... 설명에 열쇠를 사용하지 않는 또 다른 프로그램에서 또 다른 선택이있었습니다.