2012-12-11 3 views
2

이것이 선호되는 방법인지 잘 모르겠지만 해결책을 제시하고 심포니 2 위저드가이 문제에 대해 더 많은 설명을하고 있는지 확인하고 싶습니다.symfony2 독트린 테이블 잠금

금융 거래를 테이블에 등록하고 있으며 각 사용자마다 일련의 일련 번호가 있습니다 (즉, 각 사용자의 거래 테이블은 1부터 시작합니다).

나는이 코드에서 처리해야한다는 것을 이해하고 두 사람이 트랜잭션을 등록하는 동일한 사용자 계정에 로그온하거나 사용자가 여러 트랜잭션을 트리거한다고 가정하면 사용자에 대해 중복 항목이 발생할 위험이 있습니다. 동시에 쓰고 교리는 전나무가 불을 쓰기 전에 ... 두 작업에

 $em->getConnection()->exec('LOCK TABLES transaction WRITE;'); //lock for write access 

      $results = $em->createQuery("SELECT MAX(t.serial) FROM ekonomiKassabokBundle:Transaction t WHERE t.user = $userId")->getResult(); 
      $temp = $results[0]; 
      $max_serial = $temp[1]; 
      $new_serial = $max_serial + 1; 

      $entity->setSerial($new_serial); 

      $em->persist($entity); 
      $em->flush(); 

     $em->getConnection()->exec('UNLOCK TABLES;'); 

위의 코드는 저를 제공합니다 ...

SQLSTATE[HY000]: General error: 1100 Table 't0_' was not locked with LOCK TABLES 

을 건의 SELECT 작업을 수행하는 또는이 어쩌면이다 과잉 공격, 난 그냥 테이블 자물쇠를 건너 뛸까요?

+0

정확히 똑같은 문제가 있습니다. 아무 생각없이 ... 해결책을 찾았습니까? – djfm

+0

아니, 아직 해결 방법이 없습니다. –

답변

3

결국 솔루션을 찾을 수있었습니다. 솔루션.

사실 나는 그것이 바보 같다고 생각합니다 : 테이블을 잠그면 MySQL은 잠금 해제가 될 때까지 사용할 테이블을 모두 예상하고 하나의 LOCK TABLES 문에서 발생해야합니다.

Doctrine은 어떤 이유에서든 테이블 별칭을 체계적으로 사용할 것이고 MySQL은 별칭이 잠긴 테이블을 참조한다는 것을 알 수 없다는 것을 알 수 있습니다. 따라서 자신이 사용하는 모든 별칭을 구체적으로 잠글 필요가 있습니다!

시도 :

$em->getConnection()->exec('LOCK TABLES transaction as t0_ WRITE;'); 

그리고이 후 다른 오류가있는 경우 (테이블이 잠겨있는 동안 여러 쿼리를 할 경우 일 것이다), 단지 예를 들어, 추가 별칭으로 잠금을 계속 추가 :

$em->getConnection()->exec('LOCK TABLES transaction as t0_ WRITE, transaction as t0 WRITE, transaction as t1 WRITE;'); 

doctrine은 항상 동일한 테이블 별칭을 사용하기 때문에 작업을 계속해야합니다.

+0

그래도이 방법을 사용 하시겠습니까? 비슷한 문제가 있습니다. http://stackoverflow.com/questions/40796103/how-to-safely-use-uniqueentity-on-sites-with-more-than-one-simultaneous-user –