2016-12-30 3 views
2

この質問は広すぎるかもしれません。ウェブサイトで共通のデータベースを使用している場合は、2行目の場合はどうなりますか:PHP、リクエスト中にデータベースをロックしますか?

\Doctrine\Repository::getUser()->findById(1) 

はOKですが、このユーザーは削除される可能性があります。したがって6行後の8行目:

\Doctrine\Repository::getUser()->findById(1) 

例外をスローします。一般的な解決策は、リクエストの進行中にDELETE/UPDATEコマンドを防止することです。しかし、どのように?

+5

別の解決策は、例外を処理しているが使用されていることに注意してください。 – gbestard

+1

または 'SELECT FOR UPDATE'とstuff – Federkun

+1

はロックを見ます:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/transactions-and-concurrency.html – lxg

答えて

0

私の経験では、データベースからデータを完全に削除することは悪い習慣です。企業のための大きなデータを見ることは、瞬く間に大きなものです。だから、あなたはいつも戻ってユーザーや他のものを見ることができるように "削除"するためにブール値を使用することをお勧めします。しかし、あなたが本当にユーザーを削除したい場合は、例外

は、トランザクションがためているものです

if(getUser->findById(1)){ 
    getUser->findById(1); 
}else{ 
    return "some error message" ; 
} 
+3

ソフト削除IMHOも悪い習慣です。 – Federkun

+1

本当に、私は仕事をしている会社がこれをやりたいと思っています。それは単なる選択肢には理想的だと言っているわけではありません。 – KevinTheGreat

2

ような何かを行くべき扱います。あなたのケースのためにhttp://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/transactions-and-concurrency.html#approach-2-explicitly

変形例を参照してください。

$em->getConnection()->beginTransaction(); // suspend auto-commit 
try { 
    \Doctrine\Repository::getUser()->findById(1) 
    //... do some work 
    \Doctrine\Repository::getUser()->findById(1) 
    // you're done with that particular user 
    $em->getConnection()->commit(); 
} catch (Exception $e) { 
    $em->getConnection()->rollBack(); 
    throw $e; 
} 

は、あなたのリポジトリがEntityManagerのインスタンスの右側($em

関連する問題