이 글은 주로 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);
5. 그런 다음 PHP의 컬을 사용하여 이 PHP 스크립트에 대한 높은 동시 요청을 시뮬레이션하면 사용자 이름이 있는 레코드가 하나만 있을 것입니다. '므라즈'. 프로그램 실행의 예상 결과에 도달하세요~
관련 권장 사항:
위 내용은 PHP+MySQL 높은 동시성 잠금 트랜잭션 처리 문제에 대한 솔루션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!