목차
首先,死锁是怎样产生的 ?
网上的好多回答都是照搬的如下概念:
产生死锁的四个必要条件:
另外, 看到很多人说抢购/秒杀系统, 在高并发下会带来多卖的风险, 这个我就更加不能理解了 :
还有就是并行
回复内容:
백엔드 개발 PHP 튜토리얼 死锁,并发,并行,抢购概念的很多疑惑

死锁,并发,并行,抢购概念的很多疑惑

Jun 06, 2016 pm 08:06 PM
linux mysql php

首先,死锁是怎样产生的 ?

网上的好多回答都是照搬的如下概念:

产生死锁的四个必要条件:

  1. 互斥条件:一个资源每次只能被一个进程使用。

  2. 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

  3. 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

  4. 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。*

我的问题是:看了这里的介绍 , 发现貌似并发确实是会产生死锁的, 个人认为, 因为并发状态下, 可能CPU在处理某个进程的时候, 其他进程需要等待CPU切换过来找自己, 等待的过程我个人觉得就是阻塞着,也就是死锁着, 不知道理解对不对 !

另外, 看到很多人说抢购/秒杀系统, 在高并发下会带来多卖的风险, 这个我就更加不能理解了 :

按照我小菜的思维, 假设抢购1000个商品, 假设有100个请求在某一个CPU时间内一次性挤入了CPU内, 假设CPU是单核的, 那么并发不是CPU一个个不断地切换处理么? 既然这样, 也就是CPU会一个个地处理对商品的减操作, 这样的话, 每次操作的时候我判断商品剩余数量不就行了, 怎么可能多卖!!! 所以这里需要大牛稍微帮忙给解释一下

还有就是并行

假设有4个请求在某一个CPU时间内一次性挤入了CPU内, 而我们的CPU是4个核心的, 那么四个核心同时处理4个抢购进程进行商品数量递减的时候, 这个小菜认为: 这倒是确实会出现同时锁住这条商品记录导致任何一个核心都无法释放而产生死锁! 但问题是:

  1. 自己底层知识不够, 不知道是不是这4个请求一定就会分配个每个核心, 还是会全部分配到一个核心上, 再或者说压根就是随机分配 (比如核心一上2个请求,核心二上1个请求,核心三上1个请求,核心4上没有请求)? 但不管怎么说, 既然死锁了, 也不会出现抢购超卖了啊!

  2. 第二个问题是: 如果请求数量大于4个, 比如说又是100个一次性挤入了CPU内, 这时候, 又出现了并发, 而不是并行, 可能每个CPU都会进行轮训处理并发的请求 ;

回复内容:

首先,死锁是怎样产生的 ?

网上的好多回答都是照搬的如下概念:

产生死锁的四个必要条件:

  1. 互斥条件:一个资源每次只能被一个进程使用。

  2. 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

  3. 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

  4. 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。*

我的问题是:看了这里的介绍 , 发现貌似并发确实是会产生死锁的, 个人认为, 因为并发状态下, 可能CPU在处理某个进程的时候, 其他进程需要等待CPU切换过来找自己, 等待的过程我个人觉得就是阻塞着,也就是死锁着, 不知道理解对不对 !

另外, 看到很多人说抢购/秒杀系统, 在高并发下会带来多卖的风险, 这个我就更加不能理解了 :

按照我小菜的思维, 假设抢购1000个商品, 假设有100个请求在某一个CPU时间内一次性挤入了CPU内, 假设CPU是单核的, 那么并发不是CPU一个个不断地切换处理么? 既然这样, 也就是CPU会一个个地处理对商品的减操作, 这样的话, 每次操作的时候我判断商品剩余数量不就行了, 怎么可能多卖!!! 所以这里需要大牛稍微帮忙给解释一下

还有就是并行

假设有4个请求在某一个CPU时间内一次性挤入了CPU内, 而我们的CPU是4个核心的, 那么四个核心同时处理4个抢购进程进行商品数量递减的时候, 这个小菜认为: 这倒是确实会出现同时锁住这条商品记录导致任何一个核心都无法释放而产生死锁! 但问题是:

  1. 自己底层知识不够, 不知道是不是这4个请求一定就会分配个每个核心, 还是会全部分配到一个核心上, 再或者说压根就是随机分配 (比如核心一上2个请求,核心二上1个请求,核心三上1个请求,核心4上没有请求)? 但不管怎么说, 既然死锁了, 也不会出现抢购超卖了啊!

  2. 第二个问题是: 如果请求数量大于4个, 比如说又是100个一次性挤入了CPU内, 这时候, 又出现了并发, 而不是并行, 可能每个CPU都会进行轮训处理并发的请求 ;

  1. PHP是高级语言,不用考虑CPU的问题,每个请求都会分配给一个进程,php自己会去管理进程调用什么资源的。你说的死锁,应该是数据库的吧,不是进程的。

  2. 100个进程挤进去一个CPU。。CPU也会正常去一个个处理完的。。。

好了。。来说说你问的问题吧。。我尝试梳理了好久猜测你问的是啥。。简单的说下吧。。

死锁是怎么产生的

笼统点说。mysql每次对某一堆数据修改或者查询(innodb在某些条件下不受这个限制)的时候。。。会告诉系统,这片数据我要用。。别人不能动。。。然后别人再来用的时候,系统就会告诉别人。。某某某在用着这片数据,你等等。。然后别人就等着了。。。这就叫锁。。
那死锁是怎么回事呢?有的数据是有关联的,例如秒杀,你要先扣库存,还要写订单。。所以就会高速系统,库存这个你先给我锁住,等我写完订单回来,改完库存,你再把两个都放开。。。
如果这时候有另外一个人执行着相反的事情。。要先锁住订单表。然后去改库存表。
那就可能死锁,来慢镜头模拟下。。。

A:系统!锁库存表,我要去写订单表。。 系统:好的!搞定。。 B:系统!锁订单表,我要去改库存表。。 系统:好的!搞定。。

A:系统,我要写订单~ 系统:抱歉,B用户占用着,你等等。 A: 哦~

B:系统,我要改库存表 系统:抱歉,A用户占用着,你等等。 B: 哦~

几个小时过去了... A:B搞什么鬼,还没用完。。 B:A搞什么鬼,还没用完。。

服务器:你们搞什么鬼,几百万用户等着呢。。

理解了么?附代码:

SELECT `product` WHERE `pid` = 1 FOR UPDATA;
UPDATA `order` SET `status` = 1 WHERE `uid` = 2 AND `pid` = 1;
로그인 후 복사
SELECT `order` WHERE `uid` = 2 FOR UPDATA;
UPDATA `product` SET `num` = `num` + 1 WHERE `oid` = 3;
로그인 후 복사

想真实体验,就让他两条中间sleep几秒,同时请求两边,就锁住了,直到超时

这个确实把死锁说的很清楚了,原来死锁是这么产生的,我问题中的死锁也确实是数据库的死锁
那对于死锁,我觉得是个碰巧出现的事情,觉着业务逻辑如果很复杂的话,还是很容易出现这种巧合的,比如innodb下一个业务逻辑1需要一个事务(会操作a,b两张表各自的某条记录)进行完成时候,完全有可能在操作进行到a表某条记录操作刚完成的时候,也就是正准备操作b表记录时; 突然间有另一条业务逻辑2请求被cpu切换到了(巧了,它也用事务并且先操作b表的同逻辑1的记录,再操作
a表同逻辑1的记录),而他正好操作完b表的该条记录,准备请求这样目前被锁住的情况就导致逻辑一不能进行,逻辑二也不能进行! 理解的对么?

那对于为什么并发会产生多卖我还没有清楚啊,如若按照你说的,cpu总会一个个的处理请求, 那处理每个请求的时候我都判断当前库存,根本不会出现超出库存的啊

还有,您说的并发是一个一个请求进行处理 这是单cpu会出现的或者请求数大于cpu个数会出现的

如果是cpu有5颗,只过来3个请求,每个请求都要操作a表的1记录,那还真有可能3颗cpu并行同时抓住a表的1记录,这样也是死锁么? 还是说,虽然cpu并行到达这条记录,但数据库只会允许一个个来加锁,即使同时到达,但mysql还是会排队,这并不算死锁?

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

DeepSeek 웹 버전 입구 DeepSeek 공식 웹 사이트 입구 DeepSeek 웹 버전 입구 DeepSeek 공식 웹 사이트 입구 Feb 19, 2025 pm 04:54 PM

DeepSeek은 웹 버전과 공식 웹 사이트의 두 가지 액세스 방법을 제공하는 강력한 지능형 검색 및 분석 도구입니다. 웹 버전은 편리하고 효율적이며 설치없이 사용할 수 있습니다. 개인이든 회사 사용자이든, DeepSeek를 통해 대규모 데이터를 쉽게 얻고 분석하여 업무 효율성을 향상시키고 의사 결정을 지원하며 혁신을 촉진 할 수 있습니다.

DeepSeek을 설치하는 방법 DeepSeek을 설치하는 방법 Feb 19, 2025 pm 05:48 PM

Docker 컨테이너를 사용하여 사전 컴파일 된 패키지 (Windows 사용자의 경우)를 사용하여 소스 (숙련 된 개발자)를 컴파일하는 것을 포함하여 DeepSeek를 설치하는 방법에는 여러 가지가 있습니다. 공식 문서는 신중하게 문서를 작성하고 불필요한 문제를 피하기 위해 완전히 준비합니다.

PHP에서 HTML/XML을 어떻게 구문 분석하고 처리합니까? PHP에서 HTML/XML을 어떻게 구문 분석하고 처리합니까? Feb 07, 2025 am 11:57 AM

이 튜토리얼은 PHP를 사용하여 XML 문서를 효율적으로 처리하는 방법을 보여줍니다. XML (Extensible Markup Language)은 인간의 가독성과 기계 구문 분석을 위해 설계된 다목적 텍스트 기반 마크 업 언어입니다. 일반적으로 데이터 저장 AN에 사용됩니다

문자열로 모음을 계산하는 PHP 프로그램 문자열로 모음을 계산하는 PHP 프로그램 Feb 07, 2025 pm 12:12 PM

문자열은 문자, 숫자 및 기호를 포함하여 일련의 문자입니다. 이 튜토리얼은 다른 방법을 사용하여 PHP의 주어진 문자열의 모음 수를 계산하는 방법을 배웁니다. 영어의 모음은 A, E, I, O, U이며 대문자 또는 소문자 일 수 있습니다. 모음이란 무엇입니까? 모음은 특정 발음을 나타내는 알파벳 문자입니다. 대문자와 소문자를 포함하여 영어에는 5 개의 모음이 있습니다. a, e, i, o, u 예 1 입력 : String = "Tutorialspoint" 출력 : 6 설명하다 문자열의 "Tutorialspoint"의 모음은 u, o, i, a, o, i입니다. 총 6 개의 위안이 있습니다

Bitget 공식 웹 사이트 설치 (2025 초보자 안내서) Bitget 공식 웹 사이트 설치 (2025 초보자 안내서) Feb 21, 2025 pm 08:42 PM

Bitget은 스팟 거래, 계약 거래 및 파생 상품을 포함한 다양한 거래 서비스를 제공하는 Cryptocurrency 교환입니다. 2018 년에 설립 된이 교환은 싱가포르에 본사를두고 있으며 사용자에게 안전하고 안정적인 거래 플랫폼을 제공하기 위해 노력하고 있습니다. Bitget은 BTC/USDT, ETH/USDT 및 XRP/USDT를 포함한 다양한 거래 쌍을 제공합니다. 또한 Exchange는 보안 및 유동성으로 유명하며 프리미엄 주문 유형, 레버리지 거래 및 24/7 고객 지원과 같은 다양한 기능을 제공합니다.

Ouyi OKX 설치 패키지가 직접 포함되어 있습니다 Ouyi OKX 설치 패키지가 직접 포함되어 있습니다 Feb 21, 2025 pm 08:00 PM

세계 최고의 디지털 자산 거래소 인 Ouyi Okx는 이제 안전하고 편리한 거래 경험을 제공하기 위해 공식 설치 패키지를 시작했습니다. OUYI의 OKX 설치 패키지는 브라우저를 통해 액세스 할 필요가 없습니다. 설치 프로세스는 간단하고 이해하기 쉽습니다. 사용자는 최신 버전의 설치 패키지를 다운로드하고 설치를 단계별로 완료하면됩니다.

Gate.io 설치 패키지를 무료로 받으십시오 Gate.io 설치 패키지를 무료로 받으십시오 Feb 21, 2025 pm 08:21 PM

Gate.io는 사용자가 설치 패키지를 다운로드하여 장치에 설치하여 사용할 수있는 인기있는 cryptocurrency 교환입니다. 설치 패키지를 얻는 단계는 다음과 같습니다. Gate.io의 공식 웹 사이트를 방문하고 "다운로드"를 클릭하고 해당 운영 체제 (Windows, Mac 또는 Linux)를 선택하고 컴퓨터에 설치 패키지를 다운로드하십시오. 설치 중에 항 바이러스 소프트웨어 또는 방화벽을 일시적으로 비활성화하여 원활한 설치를 보장하는 것이 좋습니다. 완료 후 사용자는 GATE.IO 계정을 만들려면 사용을 시작해야합니다.

Ouyi Exchange 다운로드 공식 포털 Ouyi Exchange 다운로드 공식 포털 Feb 21, 2025 pm 07:51 PM

OKX라고도하는 Ouyi는 세계 최고의 암호 화폐 거래 플랫폼입니다. 이 기사는 OUYI의 공식 설치 패키지 용 다운로드 포털을 제공하여 사용자가 다른 장치에 OUYI 클라이언트를 설치할 수 있도록합니다. 이 설치 패키지는 Windows, Mac, Android 및 iOS 시스템을 지원합니다. 설치가 완료되면 사용자는 OUYI 계정에 등록하거나 로그인하고 암호 화폐 거래를 시작하며 플랫폼에서 제공하는 기타 서비스를 즐길 수 있습니다.

See all articles