2016-12-30 44 views
2

這個問題可能過於寬泛,但。所以網站使用共同的數據庫,如果在第2行:PHP,請求時鎖定數據庫?

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

是好的,但該用戶可能會被刪除。所以6行之後,在第8行:

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

會拋出異常!一個通用的解決方案是在請求正在進行時阻止DELETE/UPDATE命令。但如何?

+5

另一種解決方案是處理例外。 – gbestard

+1

或'SELECT FOR UPDATE'和東西 – 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

軟刪除恕我直言,這也是一種不好的做法。 – 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