>백엔드 개발 >PHP 튜토리얼 >PHP 개발의 동시성 문제를 해결하기 위한 여러 구현 방법 분석

PHP 개발의 동시성 문제를 해결하기 위한 여러 구현 방법 분석

*文
*文원래의
2017-12-21 16:24:131383검색

이 문서의 예제에서는 PHP 개발 시 동시성 문제를 해결하고 참조용으로 모든 사람과 공유하는 여러 구현 방법을 설명합니다.

제품 폭주와 같은 동시성 시나리오의 경우 과매도가 발생할 수 있습니다. 이때 동시성으로 인해 발생하는 이러한 문제를 해결해야 합니다.

PHP 언어에는 기본 동시성 솔루션이 없으므로 다른 방법을 사용해야 합니다. 동시성 제어를 달성합니다.


옵션 1: 파일 잠금 독점 잠금 사용

flock 함수는 파일 잠금을 획득하는 데 사용됩니다. 이 잠금은 동시에 하나의 스레드에서만 획득할 수 있습니다. 잠금을 차단하거나 잠금을 획득합니다.

잠금을 획득할 때 먼저 인벤토리를 쿼리하고 인벤토리가 0보다 크면 주문하고 인벤토리를 줄인 다음 잠금을 해제하세요


옵션 2: Mysql 데이터베이스에서 제공하는 비관적 잠금을 사용하세요

Innodb 스토리지 엔진은 행 수준 잠금을 지원합니다. 데이터 행이 잠기면 다른 프로세스가 해당 데이터 행에서 작업을 수행할 수 없으며 먼저 행을 잠급니다.

옵션 3: 대기열 사용

주문 요청은 대기열에 차례로 저장되고 별도의 프로세스가 백그라운드에서 사용되어 대기열의 주문 요청을 처리합니다옵션 4: Redis 사용

Redis 작업은 모두 원자적이며 상품 재고는 redis에 저장될 수 있으며, 주문하기 전에 재고에 대해 감소 작업을 수행합니다. 반환된 값이 0보다 크거나 같으면 주문을 할 수 있습니다. 그렇지 않으면 주문을 할 수 없습니다. 이 방법이 더 효율적입니다

select stock_num from table where id=1 for update
    if(stock_num > 0){
    //下订单
    update table set stock_num=stock-1 where id=1
}

기타 동시성 문제:


실제 응용 프로그램에서는 대부분의 경우 캐시에 실패하면 데이터를 가져옵니다. 이때 동시성이 크면 많은 프로세스가 동시에 데이터를 가져오기 위해 데이터베이스로 이동하여 많은 요청이 데이터베이스에 침투하여 데이터베이스가 충돌하게 됩니다. 파일 잠금을 사용하여 해결할 수 있습니다

if(redis->get('stock_num') > 0){
 stock_num = redis->decr('stock_num')
 if(stock_num >= 0){
 //下订单
 }else{
 //库存不足
 }
}else{
//库存不足
}

직접 말하면 동시성 문제를 해결하려면 잠금이 필요합니다. 다양한 솔루션의 핵심은 잠금입니다

관련 읽기:

MySQL redis 학습 및 응용

Redis에서 트랜잭션 메커니즘 및 낙관적 잠금을 구현하는 방법

MySQL 데이터베이스 최적화(3) - MySQL 비관적 잠금 및 낙관적 잠금(동시성 제어)

위 내용은 PHP 개발의 동시성 문제를 해결하기 위한 여러 구현 방법 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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