簡體   English   中英

我的服務應該實現事務和提交方法嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM