이번에는 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 중국어 웹사이트의 다른 관련 기사를 주목하세요!
추천 자료:
js 및 CSS 파일의 PHP 동적 압축 단계 자세한 설명
위 내용은 PHP+MySQL을 사용하여 동시성 잠금 트랜잭션을 처리하는 단계에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!