2011-08-30 8 views
4

mysql 5.0.92를 사용하고 있습니다. 최근에는 행이 비교적 빠르게 삽입 (및 업데이트 또는 삭제)되는 한 테이블에 많은 삽입 교착 상태가 발생합니다. 나는이 문제를 이해하지 않고 MySQL의 문서와 포럼 인 StackOverflow에서 질문을 연구했다. 나를 괴롭히는 것 중 하나는 테이블 중 하나가 innodb 상태에 따라 리소스를 잠그지 않는다는 사실입니다. 다음MySQL의 인서트에서 교착 상태가 발생했습니다.

*** (1) TRANSACTION: 
TRANSACTION 0 2326105503, ACTIVE 0 sec, process no 18871, OS thread id 1078532416 inserting 
mysql tables in use 1, locked 1 
LOCK WAIT 3 lock struct(s), heap size 1216, undo log entries 1 
MySQL thread id 225129, query id 126720476 192.168.999.999 the-user update 
insert into the_table (creation_date, expiration_date, iid, ma_c, ma_cid, ma_ed, ma_lat, ma_long, ma_ln, ma_sd, ma_sid, uid, id) values ('2011-08-30 16:54:18.0', '2011-09-01 23:59:59.0', 1001, '', 'US', '2011-09-01 23:59:59.0', 33.72, -92.61, 'CITY_CENTER', '2011-08-31 23:59:59.0', '', 1010, 'xxx') 
*** (1) WAITING FOR THIS LOCK TO BE GRANTED: 
RECORD LOCKS space id 15002 page no 5749 n bits 376 index `idx_iu` of table `the_db/the_table` trx id 0 2326105503 lock_mode X insert intention waiting 
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0 
0: len 8; hex 73757072656d756d; asc supremum;; 

*** (2) TRANSACTION: 
TRANSACTION 0 2326105502, ACTIVE 0 sec, process no 18871, OS thread id 1243085120 inserting, thread declared inside InnoDB 500 
mysql tables in use 1, locked 1 
4 lock struct(s), heap size 1216, undo log entries 2 
MySQL thread id 223875, query id 126720499 192.168.999.999 the-user update 
insert into the_table (creation_date, expiration_date, iid, ma_c, ma_cid,ma_ed, ma_lat, ma_long, ma_ln,ma_sd, ma_sid, uid, id) values ('2011-08-30 16:54:18.0','2011-12-14 23:59:59.0', 2002, 'Amsterdam', 'NL', '2011-10-04 16:45:00.0', 52.37, 4.89, 'CITY_CENTER', '2011-09-06 23:59:59.0', '', 2020, 'yyy') 
*** (2) HOLDS THE LOCK(S): 
RECORD LOCKS space id 15002 page no 5749 n bits 376 index `idx_iu` of table `the_db/the_table` trx id 0 2326105502 lock_mode X 
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0 
0: len 8; hex 73757072656d756d; asc supremum;; 

Record lock, heap no 283 PHYSICAL RECORD: n_fields 3; compact format; info bits 32 
0: len 8; hex 80000000008b22f0; asc  " ;; 1: len 4; hex 8004ab2a; asc *;; 2: len 30; hex 313331343732333235383338393330353936323430363039352020202020; asc 1314723258389305962406095  ;; 

*** (2) WAITING FOR THIS LOCK TO BE GRANTED: 
RECORD LOCKS space id 15002 page no 5749 n bits 376 index `idx_iu` of table `the_db/the_table` trx id 0 2326105502 lock_mode X insert intention waiting 
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0 
0: len 8; hex 73757072656d756d; asc supremum;; 

*** WE ROLL BACK TRANSACTION (1) 

가 테이블이 정의된다 :

CREATE TABLE `the_table` (
    `id` char(30) NOT NULL default '', 
    `iid` bigint(20) NOT NULL, 
    `uid` int(11) NOT NULL, 
    `creation_date` datetime default NULL, 
    `expiration_date` datetime default NULL, 
    `ma_sd` datetime default NULL, 
    `ma_ed` datetime default NULL, 
    `ma_c` varchar(255) default NULL, 
    `ma_sid` varchar(3) default NULL, 
    `ma_cid` varchar(3) default NULL, 
    `ma_long` double default NULL, 
    `ma_lat` double default NULL, 
    `ma_ln` varchar(50) default NULL, 
    PRIMARY KEY (`id`), 
    KEY `idx_iu` (`iid`,`uid`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

도움말이 더 이해 될 것이다 여기

SHOW INNODB STATUS의 출력이다.

+0

영구 연결을 사용하고 있습니까? 비정상적인 스크립트 종료로 인해 데이터베이스 핸들이 트랜잭션 중에 열리게 될 수 있습니다. 더 이상 이러한 트랜잭션을 소유하고있는 프로그램이 없으므로 MySQL에서 당연히 시간이 초과 될 때까지 잠금 상태를 유지합니다. –

+0

이 방법으로 데이터를 난독 화하지 마십시오. 아무에게도 호의적이지 않습니다. 당신이 어떤 비밀 정부 기관을 위해 일하지 않는다면, mysql에서 나온 것처럼 데이터를 게시하십시오. – MarkR

+0

@Marc B : JBoss 연결 풀을 사용하고 있습니다. 우리는 오랜 시간 동안 연결을 유지합니다. –

답변

1

일반적으로 교착 상태는 동일한 테이블을 사용하는 다른 트랜잭션이있을 때 테이블이 다른 순서로 변경 될 때 발생합니다.

예. 트랜잭션 1이 테이블 1을 갱신 한 후 테이블 2를 갱신하고 테이블 2를 먼저 갱신 한 후 테이블 1을 갱신하는 다른 트랜잭션이있는 경우,이 트랜잭션이 자주 실행되면 교착 상태가 _ 생할 수 있습니다.

관련 문제