>  기사  >  백엔드 개발  >  PHP+MySQL을 사용하여 동시성 잠금 트랜잭션을 처리하는 단계에 대한 자세한 설명

PHP+MySQL을 사용하여 동시성 잠금 트랜잭션을 처리하는 단계에 대한 자세한 설명

php中世界最好的语言
php中世界最好的语言원래의
2018-05-16 11:38:072749검색

PHP+MySQL을 사용하여 동시성 잠금 트랜잭션을 처리하는 단계에 대한 자세한 설명

이번에는 PHP+MySQL에서 높은 동시성 잠금 트랜잭션을 처리하는 단계에 대해 자세히 설명하겠습니다. PHP+MySQL에서 높은 동시성 잠금 트랜잭션을 처리하기 위한 주의사항은 무엇인가요? 실제 사례를 살펴보겠습니다.

1. 배경:

이제 데이터를 삽입할 때 테스트 테이블에 'mraz'라는 이름의 데이터가 있는지 판단합니다. 있는 경우 "삽입됨" 메시지가 표시됩니다. 목적은 사용자 이름이 'mraz'인 레코드만 삽입하는 것입니다.

2. 일반적인 프로그램 로직은 다음과 같습니다.

$conn = mysqli_connect('127.0.0.1', 'root', '111111') or die(mysqli_error());
mysqli_select_db($conn, 'mraz');
$rs = mysqli_query($conn, 'SELECT count(*) as total FROM test WHERE username = "mraz" ');
$row = mysqli_fetch_array($rs);
if($row['total']>0){
  exit('exist');
}
mysqli_query($conn, "insert into test(username) values ('mraz')");
var_dump('error:'.mysqli_errno($conn));
$insert_id = mysqli_insert_id($conn);
echo 'insert_id:'.$insert_id.'<br>';
mysqli_free_result($rs);
mysqli_close($conn);

3. 일반적으로 요청 수가 적은 경우에는 프로그램 로직에 문제가 없습니다. 그러나 높은 동시성 요청이 실행되면 프로그램이 예상대로 실행되지 않고 사용자 이름이 'mraz'인 여러 레코드가 삽입됩니다.

4. 솔루션:mysql의 FOR UPDATE 문과 트랜잭션을 분리하여 사용하세요. FOR UPDATE는 InnoDB에만 적용 가능하며 적용하려면 트랜잭션(BEGIN/COMMIT)에 있어야 합니다.

조정된 코드는 다음과 같습니다.

$conn = mysqli_connect('127.0.0.1', 'root', '111111') or die(mysqli_error());
mysqli_select_db($conn, 'mraz');
mysqli_query($conn, 'BEGIN');
$rs = mysqli_query($conn, 'SELECT count(*) as total FROM test WHERE username = "mraz" FOR UPDATE');
$row = mysqli_fetch_array($rs);
if($row['total']>0){
  exit('exist');
}
mysqli_query($conn, "insert into test(username) values ('mraz')");
var_dump('error:'.mysqli_errno($conn));
$insert_id = mysqli_insert_id($conn);
mysqli_query($conn, 'COMMIT');
echo 'insert_id:'.$insert_id.'<br>';
mysqli_free_result($rs);
mysqli_close($conn);

이 기사의 사례를 읽으신 후 방법을 마스터하셨다고 생각합니다. 더 흥미로운 정보를 보려면 PHP 중국어 웹사이트의 다른 관련 기사를 주목하세요!

추천 자료:

PHP에서 생성된 QR 코드 포스터 사례 분석

js 및 CSS 파일의 PHP 동적 압축 단계 자세한 설명

PHP Excel 수정 단계 자세한 설명

위 내용은 PHP+MySQL을 사용하여 동시성 잠금 트랜잭션을 처리하는 단계에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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