>  기사  >  백엔드 개발  >  PHP+MySQL 높은 동시성 잠금 트랜잭션 처리 문제에 대한 솔루션

PHP+MySQL 높은 동시성 잠금 트랜잭션 처리 문제에 대한 솔루션

不言
不言원래의
2018-05-02 09:51:291838검색

이 글은 주로 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 &#39;insert_id:&#39;.$insert_id.&#39;<br>&#39;;
mysqli_free_result($rs);
mysqli_close($conn);

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

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

코드를 조정한 후 코드는 다음과 같습니다.

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

5. 그런 다음 PHP의 컬을 사용하여 이 PHP 스크립트에 대한 높은 동시 요청을 시뮬레이션하면 사용자 이름이 있는 레코드가 하나만 있을 것입니다. '므라즈'. 프로그램 실행의 예상 결과에 도달하세요~

관련 권장 사항:

PHP+Mysql로 ​​SQL 주입을 방지하는 방법

PHP+MySQL이 페이징 표시를 구현하는 방법

PHP+MySQL 타이밍 데이터 통계 최적화

위 내용은 PHP+MySQL 높은 동시성 잠금 트랜잭션 처리 문제에 대한 솔루션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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