久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      聊聊Laravel代碼中怎么正確地使用數(shù)據(jù)庫事務(wù)

      聊聊Laravel代碼中怎么正確地使用數(shù)據(jù)庫事務(wù)

      Laravel 9 保姆級視頻教程,想學(xué)不會都難!進(jìn)入學(xué)習(xí)

      在 web 開發(fā)中,數(shù)據(jù)的完整性和準(zhǔn)確性非常重要。因此,必須確保我們編寫的代碼能夠以安全的方式存儲、更新和刪除數(shù)據(jù)庫中的數(shù)據(jù)。

      在本文中,我們將看看什么是數(shù)據(jù)庫事務(wù),為什么它們很重要,以及如何在 Laravel 開始使用它們。我們還將研究一個常見的“問題”,涉及隊列和數(shù)據(jù)庫事務(wù)。

      什么是數(shù)據(jù)庫事務(wù)?

      在我們開始研究 Laravel 的數(shù)據(jù)庫事務(wù)之前,讓我們先看看它們是什么以及它們?nèi)绾斡幸妗?/p>

      對于什么是數(shù)據(jù)庫事務(wù),有許多聽起來復(fù)雜的技術(shù)解釋。但是,對于大多數(shù) web 開發(fā)人員來說,我們只需要知道事務(wù)是完成數(shù)據(jù)庫中整個工作單元的方式。

      為了理解這實際上意味著什么,讓我們來看一個基本的例子,它將給出一點上下文。

      假設(shè)我們有一個允許用戶注冊的應(yīng)用程序。每當(dāng)用戶注冊時,我們都希望為他們創(chuàng)建一個新帳戶,然后為他們分配一個默認(rèn)角色“ general”。

      我們的代碼可能是這樣的:

      $user = User::create([     'email' => $request->email, ]);  $user->roles()->attach(Role::where('name', 'general')->first());
      登錄后復(fù)制

      乍一看,這段代碼似乎完全沒問題。但是,當(dāng)我們仔細(xì)觀察的時候,我們可以發(fā)現(xiàn)實際上有一些事情可能會出錯。我們可以創(chuàng)建用戶,但是不能為他們分配角色。這可能是由許多不同的原因造成的,比如分配角色的代碼中的錯誤,或者甚至是阻止我們到達(dá)數(shù)據(jù)庫的硬件問題。

      由于這種情況的發(fā)生,這將意味著系統(tǒng)中將有一個沒有角色的用戶。正如您可以想象的那樣,這可能會在您的應(yīng)用程序中的其他地方引起異常和 bug,因為您總是假設(shè)用戶有一個角色(這是正確的)。

      因此,為了解決這個問題,我們可以使用數(shù)據(jù)庫事務(wù)。通過使用事務(wù),它可以確保在執(zhí)行代碼時,如果出現(xiàn)任何錯誤,事務(wù)內(nèi)部對數(shù)據(jù)庫的任何更改都將回滾。例如,如果用戶被插入到數(shù)據(jù)庫中,但是由于任何原因分配角色的查詢失敗,那么事務(wù)將被回滾,用戶行將被刪除。通過這樣做,它意味著我們不能創(chuàng)建沒有分配角色的用戶。

      換句話說,它“要么全有,要么全沒有”。

      在 Laravel 中使用數(shù)據(jù)庫事務(wù)

      現(xiàn)在我們對事務(wù)是什么以及它們實現(xiàn)了什么有了一個簡單的概念,讓我們來看看如何在 Laravel 中使用它們。

      在 Laravel 中,由于我們可以在 DB 門面上訪問 transaction() 方法,因此開始使用事務(wù)實際上是很容易的事。繼續(xù)使用之前的示例代碼,讓我們看看在創(chuàng)建用戶并為其分配角色時如何使用事務(wù)。

      use IlluminateSupportFacadesDB;  DB::transaction(function () use ($user, $request): void {     $user = User::create([         'email' => $request->email,     ]);      $user->roles()->attach(Role::where('name', 'general')->first()); });
      登錄后復(fù)制

      現(xiàn)在我們的代碼被包裹在一個數(shù)據(jù)庫事務(wù)中,如果在其中的任意一點拋出異常,對數(shù)據(jù)庫的任何更改都將返回到事務(wù)開始之前的狀態(tài)。

      在 Laravel 中手動使用數(shù)據(jù)庫事務(wù)

      有時,您可能希望對事務(wù)進(jìn)行更精細(xì)的控制。例如,假設(shè)您正在與第三方服務(wù)集成,比如 Mailchinp 或 Xero。我們會說,每當(dāng)您創(chuàng)建一個新用戶時,您還需要向他們的 API 發(fā)出 HTTP 請求,以將他們也創(chuàng)建為該系統(tǒng)中的用戶。

      我們可能想要更新我們的代碼,以便如果我們無法在我們自己的系統(tǒng) ** 且 ** 在第三方系統(tǒng)中創(chuàng)建用戶,則兩個系統(tǒng)都不創(chuàng)建用戶。 如果您正在與第三方系統(tǒng)交互,那么您可能有一個可用于發(fā)出請求的類。 或者,可能有一個您可以使用的包。 有時,當(dāng)某些請求無法完成時,發(fā)出請求的類可能會拋出異常。 然而,其中一些類可能會消除錯誤,而只是從您調(diào)用的方法中返回 false,并將錯誤放置在類的字段中。

      因此,我們假設(shè)我們有以下調(diào)用 API 的基本示例類:

      class ThirdPartyService {     private $errors;      public function createUser($userData)     {         $request = $this->makeRequest($userData);          if ($request->successful()) {             return $request->body();         }          $errors = $request->errors();          return false;     }      public function getErrors()     {         return $this->errors;     } }
      登錄后復(fù)制

      當(dāng)然,上面的請求類代碼是不完整的,我下面的代碼示例也不是很清楚,但它應(yīng)該能讓您大致了解我要表達(dá)的觀點。所以讓我們使用這個請求類并將其添加到我們之前的代碼示例中:

      use IlluminateSupportFacadesDB; use AppServicesThirdPartyService;  DB::beginTransaction();  $thirdPartyService = new ThirdPartyService();  $userData = [     'email' => $request->email, ];  $user = User::create($userData);  $user->roles()->attach(Role::where('name', 'general')->first());  if ($thirdPartyService->createUser($userData)) {     DB::commit();      return; }  DB::rollBack();  report($thirdPartyService->getErrors());
      登錄后復(fù)制

      查看上面的代碼,我們可以看到我們啟動了一個事務(wù),創(chuàng)建了用戶并為他們分配了一個角色,然后我們調(diào)用了第三方服務(wù)。如果在外部服務(wù)中成功創(chuàng)建了用戶,知道所有內(nèi)容都已正確創(chuàng)建,我們就可以安全地提交數(shù)據(jù)庫更改。但是,如果沒有在外部服務(wù)中創(chuàng)建用戶,則回滾數(shù)據(jù)庫中的更改(刪除用戶及其角色分配),然后報告錯誤。

      與第三方服務(wù)交互的技巧

      作為一個額外的技巧,我通常建議將任何影響第三方系統(tǒng)、文件存儲或緩存的代碼放在數(shù)據(jù)庫調(diào)用之后

      為了更深入地理解這一點,讓我們以上面的代碼示例為例。請注意,在向第三方服務(wù)發(fā)出請求之前,我們是如何首先對數(shù)據(jù)庫進(jìn)行所有更改的。這意味著,如果從第三方請求返回任何錯誤,將回滾我們自己數(shù)據(jù)庫中的用戶和角色分配。

      然而, 如果我們反過來做,我們在修改數(shù)據(jù)庫之前發(fā)出請求,那就不是這種情況了。出于任何原因,如果我們在數(shù)據(jù)庫中創(chuàng)建用戶時發(fā)生任何錯誤,我們會在第三方系統(tǒng)中創(chuàng)建一個新用戶,但是在我們系統(tǒng)中卻沒有創(chuàng)建。如你所想, 這可能會導(dǎo)致

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號