내 애플리케이션에서 교착 상태 문제를 조사하려고합니다. 내 테이블은 이런 식으로 보입니다.MySQL InnoDB에서 다음과 같은 쿼리가 잠길 때
CREATE TABLE `requests` (
`req_id` bigint(20) NOT NULL auto_increment,
`status` varchar(255) default NULL,
`process_id` varchar(200) default NULL,
PRIMARY KEY (`req_id`),
KEY `status_idx` USING BTREE (`status`),
KEY `pk_idx_requests` USING BTREE (`req_id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8
- 이 서비스는 (다중 스레드) 문제는이 테이블에 문을 삽입합니다.
여러 클라이언트가 두 개의 별도 트랜잭션에서 다음 쿼리를 순서대로 발행합니다.
업데이트 요청 설정 PROCESS_ID = ' "+ 여기서 hostName +" "상태 ='완료 '및 PROCESS_ID가 null 순서 req_id 오름차순 한도 100 여기서"요청에서 *
선택 여기서 PROCESS_ID =' "+ 여기서 hostName +" '어디 상태 ='수신 ';
업데이트 요청 상태를 설정 ='XYZ '3 쿼리
Req_id 2 쿼리에서 검색 REQ ID의 목록입니다'req_id = '이 처리
,536,913,632. 10그러나 클라이언트 측에서 어떤 경우에는 예외가 발생합니다.
Deadlock found when trying to get lock; try restarting transaction
org.hibernate.exception.LockAcquisitionException: could not execute native bulk manipulation query
위의 쿼리로 인해 교착 상태가 발생할 수 있습니까? 그렇다면 어떻게 해결할 수 있습니까? 또한이 문제를 로컬에서 재현 할 수있는 방법이 있습니까? 여기
는 '쇼 InnoDB의 상태'의 출력이
LATEST DETECTED DEADLOCK
------------------------
120507 6:03:21
*** (1) TRANSACTION:
TRANSACTION 115627, ACTIVE 1 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 3 lock struct(s), heap size 1248, 25 row lock(s)
MySQL thread id 432399, OS thread handle 0x419e4940, query id 4111695 * * * Searching rows for update
update requests set process_id='**' where status='Received' and process_id is null order by req_id asc limit 100
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 4 page no 3797 n bits 136 index `PRIMARY` of table `db`.`requests` trx id 115627 lock_mode X locks rec but not gap waiting
Record lock, heap no 67 PHYSICAL RECORD: n_fields 27; compact format; info bits 0
*** (2) TRANSACTION:
TRANSACTION 115626, ACTIVE 1 sec updating or deleting
mysql tables in use 1, locked 1
3 lock struct(s), heap size 1248, 2 row lock(s), undo log entries 1
MySQL thread id 432403, OS thread handle 0x41c19940, query id 4111694 * * * Updating
update requests set status='Processing', process_id='**' where req_id=3026296
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 4 page no 3797 n bits 136 index `PRIMARY` of table `db`.`requests` trx id 115626 lock_mode X locks rec but not gap
Record lock, heap no 67 PHYSICAL RECORD: n_fields 27; compact format; info bits 0
'show engine innodb status'출력이 거의 수정되지 않았습니다. – RandomQuestion