>  기사  >  데이터 베이스  >  PDO MySQL의 동시 PHP 트랜잭션이 서로 간섭할 수 있습니까?

PDO MySQL의 동시 PHP 트랜잭션이 서로 간섭할 수 있습니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-01 04:43:27378검색

 Can Concurrent PHP Transactions in PDO MySQL Interfere with Each other?

PDO MySQL의 트랜잭션 격리 이해

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 표준에 따라 네 가지 격리 수준이 있습니다.

  • 커밋되지 않은 읽기: 커밋되지 않은 데이터를 읽을 수 있습니다. 동시 트랜잭션은 서로 간섭할 수 있습니다.
  • READ COMMITTED: 다른 트랜잭션에서 커밋된 데이터만 읽을 수 있습니다. 동시 트랜잭션은 일반적으로 방해하지 않습니다.
  • REPEATABLE READ: 다른 트랜잭션이 현재 트랜잭션에서 읽은 데이터를 수정하는 것을 방지합니다. 동시 트랜잭션이 동일한 데이터를 수정하려고 하면 여전히 방해가 될 수 있습니다.
  • SERIALIZABLE: 트랜잭션이 직렬 방식으로 실행되도록 보장하여 동시 트랜잭션 간의 간섭을 방지합니다.

주어진 시나리오에서 SERIALIZABLE 격리 수준을 사용하고 자동 커밋을 비활성화하면 각 트랜잭션이 격리되어 순차적으로 실행되므로 급여는 12000이 됩니다.

그러나 다른 격리 수준이나 자동 커밋이 활성화된 SERIALIZABLE을 사용하면 , 결과는 11000이 됩니다. 이는 이러한 경우 트랜잭션이 중복되어 잠재적인 간섭이 발생할 수 있기 때문입니다. 잠금 읽기를 사용하면 결과에 영향을 미칠 수 있으며 잠재적으로 모든 격리 수준에서 12000의 급여로 이어질 수 있습니다.

따라서 사용된 특정 격리 수준 및 구성 설정에 따라 PHP 스크립트의 동시 트랜잭션 간의 간섭 또는 부족이 결정됩니다. .

위 내용은 PDO MySQL의 동시 PHP 트랜잭션이 서로 간섭할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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