国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

在Laravel中使用數據庫事務以及捕獲事務失敗后的異常

newtrek / 2242人閱讀

摘要:在中要想在數據庫事務中運行一組操作,則可以在中使用方法。如果在事務的閉包內拋出異常,事務將會被自動還原。

Description

在Laravel中要想在數據庫事務中運行一組操作,則可以在 DB facade 中使用 transaction 方法。如果在事務的閉包內拋出異常,事務將會被自動還原。如果閉包運行成功,事務將被自動提交。你不需要擔心在使用 transaction 方法時還需要親自去手動還原或提交事務:

</>復制代碼

  1. DB::transaction(function () {
  2. DB::table("users")->update(["votes" => 1]);
  3. DB::table("posts")->delete();
  4. });

手動操作事務

如果你想手動處理事務并對還原或提交操作進行完全控制,則可以在 DB facade 使用 beginTransaction 方法:

</>復制代碼

  1. DB::beginTransaction();

你也可以通過 rollBack 方法來還原事務:

</>復制代碼

  1. DB::rollBack();

最后,可以通過 commit 方法來提交這個事務:

</>復制代碼

  1. DB::commit();

注意: DB facade 的事務方法也可以用來控制 查詢語句構造器 及 Eloquent ORM 的事務。

Example

假設有要在數據庫中存儲一個知識點,這個知識點同時屬于兩個不同的考點,也就是考點和知識點這兩個數據是多對多的關系,那么要實現這種數據結構就需要三個表:

知識點表 wiki:

</>復制代碼

  1. ---------------------------------------
  2. id title content
  3. ---------------------------------------

考點表 tag:

</>復制代碼

  1. -------------------
  2. id name
  3. -------------------

考點知識點關聯表 wiki_tag_rel

</>復制代碼

  1. ----------------------------------
  2. id tag_id wiki_id
  3. ----------------------------------

現在要開啟事務新增Wiki數據,新增wiki成功后再把它關聯到指定的考點上去

(在laravel中使用查詢構建器或者Eloquent ORM執行query時,如果失敗會返回 IlluminateDatabaseQueryException 異常)

</>復制代碼

  1. get("tag_id"));
  2. $wiki_id = DB::table("wiki")->insertGetId([
  3. "title" => $request->get("title"),
  4. "content" => $request->get("content")
  5. ]);
  6. $relationData = [];
  7. foreach($tagIds as $tagId) {
  8. $data = ["wiki_id" => $wiki_id, "tag_id" => $tagId];
  9. $relationData[] = $data;
  10. }
  11. DB::table("wiki_tag_rel")->insert($relationData);
  12. DB::commit();
  13. } catch(IlluminateDatabaseQueryException $ex) {
  14. DB::rollback();
  15. return Response::json(["status" => "error", "error_msg" => "Failed, please contact supervisor"]);
  16. }
  17. return Response::json(["status" => "ok"]);
  18. }
  19. //用DB facade的事務方法控制 Eloquent ORM的事務
  20. public function createWiki(array $data)
  21. {
  22. DB::beginTransaction();
  23. try {
  24. $tagIds = explode(",", $data["tag_id"]);
  25. $newWiki = Wiki::create([
  26. "title" => $data["title"],
  27. "content" => $data["content"]
  28. ]);
  29. //Wiki和Tag兩個Model使用了belongsToMany建立了多對多的關系
  30. //通過attach方法來附加wiki和tag的關系(寫入中間表)
  31. $newWiki->tags()->attach($tagIds);
  32. DB::commit();
  33. } catch(QueryException $ex) {
  34. DB::rollback();
  35. return Response::json(["status" => "error", "error_msg" => "Failed, please contact supervisor"]);
  36. }
  37. return Response::json(["status" => "ok"]);
  38. }
  39. }

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/22320.html

相關文章

  • Laravel核心解讀--異常處理

    摘要:請求未通過的驗證時會拋出此異常。異常處理是非常重要但又容易讓開發者忽略的功能,這篇文章簡單解釋了內部異常處理的機制以及擴展異常處理的方式方法。 異常處理是編程中十分重要但也最容易被人忽視的語言特性,它為開發者提供了處理程序運行時錯誤的機制,對于程序設計來說正確的異常處理能夠防止泄露程序自身細節給用戶,給開發者提供完整的錯誤回溯堆棧,同時也能提高程序的健壯性。 這篇文章我們來簡單梳理一下...

    includecmath 評論0 收藏0
  • 據庫事務

    摘要:確保持久性是數據庫系統中稱為恢復管理部件的軟件部件責任。中止狀態事務回滾并且數據庫已恢復到事務開始執行前的狀態之后。   事務是構成單一邏輯工作單元的操作集合。即使有故障,數據庫系統也必須保證事務的正確執行,即執行整個事務或屬于該事務的操作一個也不執行。 一、事務概念   事務是訪問并可能更新各種數據項的一個程序執行單元。事務由事務開始(begin transaction)與事務結束(...

    svtter 評論0 收藏0

發表評論

0條評論

newtrek

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<