>  기사  >  데이터 베이스  >  PDO를 사용한 MySQL 트랜잭션이 간섭 없이 동시에 실행될 수 있습니까?

PDO를 사용한 MySQL 트랜잭션이 간섭 없이 동시에 실행될 수 있습니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-28 04:16:02829검색

 Can MySQL Transactions with PDO Run Concurrently Without Interference?

PDO를 사용한 MySQL 트랜잭션의 동시성 탐색

데이터베이스 트랜잭션 주제에는 원자성, 일관성, 격리 및 내구성을 나타내는 약어 ACID가 동반되는 경우가 많습니다. 간단히 말해서 트랜잭션은 데이터베이스 작업이 안정적으로 수행되고 다른 동시 연결의 영향을 받지 않도록 보장합니다.

그러나 질문이 생깁니다. 여러 PHP 스크립트가 간섭 없이 동시에 트랜잭션을 실행할 수 있습니까? 이를 이해하려면 다음 시나리오를 고려하십시오.

"id"와 "salary"라는 두 개의 필드가 있는 "employees"라는 테이블을 가정해 보겠습니다. 두 스크립트, 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;

$stmt = $conn->prepare("UPDATE employees SET salary = {$salary} WHERE name = ?");
$stmt->execute(['ana']);

$conn->commit();</code>

이 시나리오에서 "ana"의 결과 급여는 얼마입니까?

답은 다음에 따라 다릅니다. MySQL InnoDB 테이블 엔진에 대해 구성된 격리 수준입니다. InnoDB는 SQL 표준에 지정된 대로 네 가지 격리 수준을 지원합니다.

  • 커밋되지 않은 읽기
  • 커밋된 읽기
  • 반복 가능한 읽기
  • 직렬화 가능

기본적으로 MySQL은 "커밋된 읽기" 격리 수준을 사용합니다. 이 수준에서 결과는 11000입니다. 이는 script1.php와 script2.php가 둘 중 하나가 커밋되기 전에 동일한 데이터를 읽기 때문입니다.

"직렬화 가능" 격리 수준을 사용하는 경우 결과는 12000입니다. 이는 직렬화 가능이 트랜잭션이 순차적으로 실행되도록 보장하고 다른 트랜잭션이 잠긴 데이터를 방해하는 것을 방지하기 때문입니다.

주어진 예에서 이벤트 순서는 다음과 같습니다.

  1. script1.php가 선택합니다. 데이터
  2. script2.php는 데이터 선택
  3. script1.php는 데이터 업데이트
  4. script2.php는 데이터 업데이트
  5. script1.php 커밋
  6. script2.php 커밋

"커밋 읽기" 격리를 사용하면 두 스크립트 모두 커밋하기 전에 동일한 데이터를 읽습니다. 따라서 급여 인상은 격리되지 않고 두 번 적용되어 2000이 증가합니다.

"직렬화 가능" 격리를 사용하면 첫 번째 트랜잭션(script1.php)이 "ana"에 대한 행을 잠급니다. 데이터를 선택합니다. script2.php가 동일한 데이터를 선택하려고 하면 첫 번째 트랜잭션이 커밋될 때까지 기다립니다. 이렇게 하면 데이터를 읽는 동안 다른 트랜잭션에 의해 데이터가 수정되지 않으며, 급여 인상은 한 번만 적용되어 1000이 증가합니다.

따라서 동시 트랜잭션 간의 간섭은 격리 수준 및 특정 작업 순서. 동시 환경에서 트랜잭션이 의도한 대로 작동하도록 하려면 다양한 격리 수준의 의미를 이해하는 것이 중요합니다.

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

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