2012-06-21 2 views
1

나는 여러 사용자가 서로 상호 작용하고 공유 데이터를 읽고/결정/공유하는 webapp을 만들고 있습니다.PHP PDO와의 트랜잭션은 얼마나 동시성으로 작동합니까?

저는 트랜잭션이 원자 적이라는 것을 읽었습니다. 이것이 필요한 것입니다. 그러나 나는 PHP와 함께 작동하는 방법을 잘 모르겠다.

하나의 트랜잭션이 일부 데이터를 편집하고있는 것처럼 나는 다른 모든 트랜잭션 또한 수정/첫 번째 트랜잭션이 완료 될 때까지 대기해야합니다. 마찬가지로 두 개의 스크립트가 값을 읽고, 이전 스크립트를 증가 시키며 효과적으로 하나의 증분 만 저장하는 것을 원하지 않습니다. 두 번째 스크립트는 첫 번째 스크립트가 끝날 때까지 기다려야합니다.

내가 본 적이있는 거의 모든 예에서 쿼리는 연속적으로 사용됩니다 (예 : PHP + MySQL transactions examples). 내가 뭘하는지의 많은 동일한 트랜잭션의 일부로서,

  • 쿼리 및 데이터를 확인하고 행동하는
  • 를 가져 오는이 필요

  1. 윌 쿼리 사이에 PHP 코드가 있으면 트랜잭션이 여전히 원자 적으로 작동합니까?
  2. 나는 거래 밖에서 진술을 준비해야하지만 내부적으로 준비해도 될까요? 기본적으로 트랜잭션의 원 자성을 손상시키는 PHP 활동에 대해 걱정하고 있습니다.

다음은 예입니다. 이전 값을 확인할 필요가 없습니다. 나는 시리얼 배열로 메일을 저장하는 아주 기본적인받은 편지함 시스템을 가지고있다. 그래서 나는 그것을 질의하고, 새로운 메시지를 추가하고 그것을 저장한다. 예상대로 작동합니까?

$getMail = $con->prepare('SELECT messages FROM inboxes WHERE id=?'); 
$storeMail = $con->prepare('UPDATE inboxes SET messages=? WHERE id=?'); 
$con->beginTransaction(); 
$getMail->execute(array($recipientID)); 
$result = $getMail->fetch(); 
$result = unserialize($result[0]); 
$result[] = $msg; 
$storeMail->execute(array(serialize($result), $recipientID)); 
$con->commit(); 
+0

원자력에 대한 이해를 설명하는 것이 좋습니다. – Adi

+0

@ Adnan Shammout이 – Raekye

답변

8

거래는 동일한 데이터를 사용하려고 시도하는 다른 데이터베이스 연결에 대한 원자이다, 즉, 다른 연결을 볼 수 중 하나 트랜잭션에 의해 없는 변경, 또는 모든 변경; "원자"는 다른 데이터베이스 연결이 없다는 것을 의미하며 일부 데이터는 업데이트되고 다른 데이터는 업데이트되지 않습니다.

쿼리 사이의 PHP 코드는 원 자성을 손상시키지 않으며 진술을 준비하는 데는 문제가되지 않습니다.

+0

흠을 추가했습니다. 하지만 거래가 진행되는 동안 다른 거래가 데이터를 읽을 수 있습니까? 내가 트랜잭션의 중간에 있고 누군가가 종종 적절한 동시성의 목적을 상실하는 오래된 가치를 읽는 경우. 미안 당신이 제대로 안되면 – Raekye

+0

['SELECT FOR UPDATE'] (http://dev.mysql.com/doc/refman/5.6/en/innodb-locking-reads.html) 또는 [serializable 트랜잭션 격리] (http://dev.mysql.com/doc/refman/5.6/en/set-transaction.html) – lanzz

+0

나는 그 (것)들을 전에 보았다 그러나 나가 다만 거래와 함께 떠날 수 있기를 바랐다. 나는'select for update'에 대해 다른 견해를 봤지만, 언제 잠금 해제가되는지를 알 수 없습니다. 다음 업데이트 후에? 트랜잭션이 커밋 될 때/후에? – Raekye

관련 문제