MySQL과 PHP + Propel 1.3을 사용하는 동안 동시성 문제가있는 것 같습니다. 아래는 Propel 객체의 "save"메소드의 작은 예제입니다.동시성 문제
public function save(PropelPDO $con = null) {
$con = Propel::getConnection();
try {
$con->beginTransaction();
sleep(3); // ignore this, used for testing only
parent::save($con);
$foo = $this->getFoo(); // Propel object, triggers a SELECT
// stuff is happening here...
$foo->save($con);
$con->commit();
} catch (Exception $e) {
$con->rollBack();
throw $e;
}
}
문제는 $ foo 개체입니다. 아주 짧은 시간에 예제 메소드를 차례로 두 번 호출한다고 가정 해 봅시다. 첫 번째 트랜잭션이 그것을 저장할 수있는 기회가 전에 어떤 경우에는 두 번째 트랜잭션이 ... ... ...
$foo->save($con);
... $ foo는을
$foo = $this->getFoo();
을 $ foo는을 읽는 경우 두 번째 거래가 읽히고 오래된 것이되고 나쁜 일이 일어날 것입니다.
테이블의 잠금을 강제로 수행 할 수 있습니다. Foo 오브젝트가 저장되어 후속 트랜잭션이 첫 번째 작업이 완료된 후에 만 읽을 수 있도록합니까?
편집 : 컨텍스트는 웹 응용 프로그램입니다. 간단히 말해서 어떤 경우에는 데이터 수정 ($ foo의 페치와 저장 사이에서 발생하는)을 가장 먼저 요청하기를 원합니다. 모든 후속 요청은 수정을 할 수 없어야합니다. 수정이 발생할지 여부는 가져온 $ foo 상태 (테이블 행 속성)에 따라 다릅니다. 두 개의 트랜잭션이 동일한 $ foo를 가져 오는 경우 수정이 두 번 발생하여 문제가 발생합니다.
루프 등에서이 저장 메서드를 호출하고 있습니까? 아니면 두 명의 사용자가 본질적으로 동시에이 리소스에 접속했기 때문에이 문제가 연결간에 문제가되는 것입니까? –
후자의 경우. – Ree
브라우저 기반 응용 프로그램 인 경우 동시에 사용할 필요는 없습니다. 이 예제를 보자. 사람 A와 B는 어느 시점에서 같은 데이터 행을로드한다. 사람 A가 변경하고 저장하고 화면을 새로 고침하며 데이터가 좋아 보인다. 사람 C가 화면을로드하고 사람 A의 변경을 확인합니다. 사람 B가 마침내 데이터를 저장합니다. 사람 A는 데이터를로드하지만 변경 사항이 누락되었습니다. –