[英]Should my Service implements transaction & commit method?
假設我要在UsersController
進行批量用戶更新。
在我的UsersController
我這樣做:
foreach ($users as $user) {
$userService = new UserService();
$user->updateUser($data);
}
如果有很多用戶,它會變慢,因為UserService :: updateUser方法只是執行persist()
/ flush()
所以我想知道這樣做是不是一個好主意:
class UserService {
public function setUseTransaction($flag)
{
$this->useTransaction = $flag;
return $this;
}
public function updateUser($data)
{
// some data mapping
$entityManager->persist($user);
if ($this->useTransaction) {
$entityManager->flush();
}
}
public function commit()
{
$entityManager->flush();
}
}
然后在我的UsersController
我可以執行以下操作:
$userService = new UserService();
$userService->setUseTransaction(true);
foreach ($users as $user) {
$userService = new UserService();
$user->updateUser($data);
}
$userService->commit();
你在想什么
我不想在我的服務層之上公開任何事務管理內容。 我可能會將所有這些東西都推送到了我的服務中,並公開了兩個公共方法updateUser(userEntity)(用於一次隱式刷新)和updateUsers(用戶數組)(用於批量更新)
大致類似於:
class UserService {
public function updateUser(User $user){
$this->_updateUser();
$this->em()->flush();
}
public function updateUsers(array $users){
foreach($users as $u) $this->_updateUser($u);
$this->em()->flush();
}
private function _updateUser(User $user){
//do stuff to $user
$this->em()->persist($user);
}
}
然后,如果您以后決定將更新分為100個組或其他任何組,則所有批量更新邏輯都會很好地納入服務中,而不是放在控制器中可能存在的多個位置。
將所有內容包裝在事務中肯定會加快處理速度。
但是,將整個批量更新作為單個SQL查詢編寫將快數百倍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.