> 데이터 베이스 > MySQL 튜토리얼 > MySQL이 일괄 교착 상태를 업데이트하는 방법을 자세히 설명하는 기사

MySQL이 일괄 교착 상태를 업데이트하는 방법을 자세히 설명하는 기사

藏色散人
풀어 주다: 2023-04-13 16:32:37
앞으로
1610명이 탐색했습니다.

이 기사에서는 MySQL이 교착 상태를 일괄적으로 업데이트하는 방법에 대해 주로 설명합니다. 관심 있는 친구는 아래를 참조해 보세요.

MySQL이 일괄 교착 상태를 업데이트하는 방법을 자세히 설명하는 기사

테이블 구조는 다음과 같습니다.

CREATE TABLE `user_item` (
  `id` BIGINT(20) NOT NULL,
  `user_id` BIGINT(20) NOT NULL,
  `item_id` BIGINT(20) NOT NULL,
  `status` TINYINT(4) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_1` (`user_id`,`item_id`,`status`)) ENGINE=INNODB DEFAULT CHARSET=utf-8
로그인 후 복사

SQL 문은 다음과 같습니다.

update user_item set status=1 where user_id=? and item_id=?
로그인 후 복사

원인 분석:

 mysql的事务支持与存储引擎有关,MyISAM不支持事务,INNODB支持事务,更新时采用的是行级锁。这里采用的是INNODB做存储引擎,意味着会将update语句做为一个事务来处理。前面提到行级锁必须建立在索引的基础,这条更新语句用到了索引idx_1,所以这里肯定会加上行级锁。

 行级锁并不是直接锁记录,而是锁索引,如果一条SQL语句用到了主键索引,mysql会锁住主键索引;如果一条语句操作了非主键索引,mysql会先锁住非主键索引,再锁定主键索引。
로그인 후 복사

이 업데이트 문은 다음 단계를 수행합니다.

  1. 기본 키가 아니기 때문에 인덱스가 사용되면 먼저 idx_1을 얻어야 합니다. 그런 다음 행 수준 잠금

  2. 이 기본 키를 기반으로 업데이트되므로 기본 키에 대한 행 수준 잠금

  3. 을 얻어야 합니다. 업데이트가 완료되면 모든 잠금을 커밋하고 해제합니다.

1단계와 2단계 사이에 update user_item .....여기서 id=? 및 user_id=? 명령문이 갑자기 삽입되면 이 명령문은 먼저 기본 키 인덱스를 잠근 다음 idx_1을 잠급니다.

한 문은 idx_1에 대한 잠금을 획득하고 기본 키 인덱스에 대한 잠금을 기다립니다. 다른 문은 기본 키에 대한 잠금을 획득하고 idx_1에 대한 잠금을 기다리므로 교착 상태가 발생합니다.

해결책:

  1. 먼저 업데이트해야 할 레코드의 기본 키
    select id from user_item where user_id=? and item_id=?
    로그인 후 복사
    를 가져옵니다
  2.  update user_item set status=? where id=? and user_id=?
    로그인 후 복사
    를 하나씩 업데이트하세요
  3. 배치 주기에서 첫 번째와 두 번째 단계를 반복하세요

추천 학습: " MySQL 비디오 튜토리얼

위 내용은 MySQL이 일괄 교착 상태를 업데이트하는 방법을 자세히 설명하는 기사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:learnku.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿