亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果發生錯誤,如何避免數據插入?Laravel 中的(多次插入的方法)

如果發生錯誤,如何避免數據插入?Laravel 中的(多次插入的方法)

PHP
慕少森 2023-07-21 16:14:42
我正在構建一個 Web 應用程序,并且我意識到可能存在問題。我有一個控制器,其中有一個store方法。此方法在數據庫中創建多個插入。public function store(LocationPostRequest $request){  $location = Location::create([...]);  $order = new Order([...]);  $location->order()->save($order);  $contact = Contact::findOrFail(id);  $order->contacts()->save($contacts);  Transaction::create([])}正如你所看到的,我有很多插入內容。如果發生錯誤(或者用戶在某個時刻失去連接),它將破壞我的數據庫的完整性,因為我的方法將添加第一個元素,但不會添加其他元素。我這樣想對嗎?如何避免這種情況?
查看完整描述

3 回答

?
MMTTMM

TA貢獻1869條經驗 獲得超4個贊

您可以使用 laravel 數據庫交易。

如果任何數據庫查詢失敗,它將自動回滾之前的查詢。

DB::transaction(function () {
    //set of queries
   //example 
   DB::table('users')->update(['votes' => 1]);
   DB::table('posts')->delete();
});


查看完整回答
反對 回復 2023-07-21
?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

是的,你說得完全正確。您擔心的是數據庫的普遍問題。典型的例子是銀行轉賬,即你向我匯款。需要從您的資金中減去該金額并添加到我的資金中。如果第一次操作就失敗了,那就是運氣不好,但至少沒有人賠錢。如果它在中間某個地方失敗了,在從你那里扣除錢之后,但在將錢添加到我之前,那么你將很難說服我你實際上已經發送了金額,而你已經損失了給定的金額。

您的情況類似,可能風險較小,但仍然重要的是確保在發生故障時恢復操作之前的數據庫狀態。這就是產生這樣一種想法的原因:某些操作應該彼此形成原子綁定,并且它們應該要么一起成功,要么一起失敗。這種將操作綁定在一起的操作稱為事務。

交易是:

  • 阿托米克_

  • 一致_

  • 耐用_

  • 索然無味

這些共同構成了 ACID 原則,這是你在憂慮中直觀發現的。Laravel 有自己的事務支持,您可以通過以下方式調用:

DB::transaction($somefunction)

你的工作是將你的函數作為參數傳遞給DB::transaction,不用擔心,因為如果失敗,Laravel 會聲稱會發生回滾。不過,我肯定會進行測試,因為正如溫斯頓·丘吉爾所說:

無論策略多么美好,你都應該偶爾看看結果。


查看完整回答
反對 回復 2023-07-21
?
富國滬深

TA貢獻1790條經驗 獲得超9個贊

您可以將 try 和 catch 與 DB:transaction() 一起使用。


try {

        //start the transaction

        DB::beginTransaction();


        //You code


        //commit the transaction

        DB::commit();

} catch (\Exception $e) {

        DB::rollBack();

        return response;

}

希望這可以幫助


查看完整回答
反對 回復 2023-07-21
  • 3 回答
  • 0 關注
  • 208 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號