2017-10-05 11 views
1

私はPHP 7.1とSymfony 3.2でサーバーAPIを休止しています。私は、ユーザーがドラフトを持っているかどうかをチェックし、ドラフトを持っていない場合は作成したドラフトを要求します。この問題は、同じユーザーが2つの同時要求を行う場合に発生します。両方の要求が検証に合格し、ユーザーに下書きがないことがわかります。最初に到着するとドラフトが作成され、後で到着するドラフトはそのドラフトを作成しようとし、教義の例外をスローします。同時リクエスト(PHPとSymfony)のEvadeデータベースエラー

[Exception]: Doctrine \ DBAL \ Exception \ UniqueConstraintViolationException 

[message]: An exception occurred while executing 'INSERT INTO ChecklistDraft (id, title, description, estimated_time, creator_id) VALUES (?,?,?,?)' with params [101, null, null, null, 50121] : 
SQLSTATE [23000]: Integrity constraint violation: 1062 Duplicate entry '50121' for key 'UNIQ_910CB4B461220EA6' . 

[file]: /project/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php . 

サーバは500を返しますが、これは発生しません。私はすべての要求で例外を制御することができますが、別の要求でコードが間違っていて例外がスローされた場合は通知されません。

答えて

0

documentation of doctrineは、これをどのように処理するかを説明します。

私はあなたのための最善の方法は、教義のトランザクションを作成し、このようなだけで、あなたの Doctrine\DBAL\Exception\UniqueConstraintViolationExceptionない \Exceptionをキャッチすることだと思う:あなたはあなたができるロールバックした後、再び例外オブジェクトをスローせずに \Exceptionクラスをキャッチ

$em->getConnection()->beginTransaction(); // suspend auto-commit 
try { 
    //... do some work 
    $em->persist($draft); 
    $em->flush(); 
    $em->getConnection()->commit(); 
} catch (Doctrine\DBAL\Exception\UniqueConstraintViolationException $e) { 
    $em->getConnection()->rollBack(); 
} 

(PHPSpecでコードをテストし、PHPSPecの例外がコードでキャッチされた場合など)

関連する問題