PHP 문서는 트랜잭션의 이점을 강조하고 데이터베이스 내에서 원자성, 일관성, 격리성 및 내구성을 보장하는 기능을 강조합니다. .
질문:
이는 트랜잭션을 동시에 실행하는 별도의 PHP 스크립트가 간섭 없이 작동할 수 있음을 의미합니까?
간섭에 대한 설명:
다음 데이터가 있는 직원 테이블을 생각해 보세요.
id | name | salary |
---|---|---|
1 | ana | 10000 |
비슷한 코드가 있는 두 스크립트가 동시에 실행됩니다.
script1.php 및 script2.php:
<code class="php">$conn->beginTransaction(); $stmt = $conn->prepare("SELECT * FROM employees WHERE name = ?"); $stmt->execute(['ana']); $row = $stmt->fetch(PDO::FETCH_ASSOC); $salary = $row['salary']; $salary = $salary + 1000;//increasing salary $stmt = $conn->prepare("UPDATE employees SET salary = {$salary} WHERE name = ?"); $stmt->execute(['ana']); $conn->commit();</code>
다양한 실행 시나리오에서 '아나'의 결과 급여에 대한 의문이 제기됩니다.
답변:
결과는 격리 수준에 따라 다릅니다. MySQL의 InnoDB 테이블 엔진용으로 구성되었습니다. SQL 표준에 따라 네 가지 격리 수준이 있습니다.
주어진 시나리오에서 SERIALIZABLE 격리 수준을 사용하고 자동 커밋을 비활성화하면 각 트랜잭션이 격리되어 순차적으로 실행되므로 급여는 12000이 됩니다.
그러나 다른 격리 수준이나 자동 커밋이 활성화된 SERIALIZABLE을 사용하면 , 결과는 11000이 됩니다. 이는 이러한 경우 트랜잭션이 중복되어 잠재적인 간섭이 발생할 수 있기 때문입니다. 잠금 읽기를 사용하면 결과에 영향을 미칠 수 있으며 잠재적으로 모든 격리 수준에서 12000의 급여로 이어질 수 있습니다.
따라서 사용된 특정 격리 수준 및 구성 설정에 따라 PHP 스크립트의 동시 트랜잭션 간의 간섭 또는 부족이 결정됩니다. .
위 내용은 PDO MySQL의 동시 PHP 트랜잭션이 서로 간섭할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!