猿问

如果发生错误,如何避免数据插入?Laravel 中的(多次插入的方法)

我正在构建一个 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([])

}

正如你所看到的,我有很多插入内容。


如果发生错误(或者用户在某个时刻失去连接),它将破坏我的数据库的完整性,因为我的方法将添加第一个元素,但不会添加其他元素。


我这样想对吗?如何避免这种情况?


慕少森
浏览 165回答 3
3回答

MMTTMM

您可以使用 laravel 数据库交易。如果任何数据库查询失败,它将自动回滚之前的查询。DB::transaction(function () {     //set of queries    //example     DB::table('users')->update(['votes' => 1]);    DB::table('posts')->delete(); });

Cats萌萌

是的,你说得完全正确。您担心的是数据库的普遍问题。典型的例子是银行转账,即你向我汇款。需要从您的资金中减去该金额并添加到我的资金中。如果第一次操作就失败了,那就是运气不好,但至少没有人赔钱。如果它在中间某个地方失败了,在从你那里扣除钱之后,但在将钱添加到我之前,那么你将很难说服我你实际上已经发送了金额,而你已经损失了给定的金额。您的情况类似,可能风险较小,但仍然重要的是确保在发生故障时恢复操作之前的数据库状态。这就是产生这样一种想法的原因:某些操作应该彼此形成原子绑定,并且它们应该要么一起成功,要么一起失败。这种将操作绑定在一起的操作称为事务。交易是:阿托米克_一致_耐用_我索然无味这些共同构成了 ACID 原则,这是你在忧虑中直观发现的。Laravel 有自己的事务支持,您可以通过以下方式调用:DB::transaction($somefunction)你的工作是将你的函数作为参数传递给DB::transaction,不用担心,因为如果失败,Laravel 会声称会发生回滚。不过,我肯定会进行测试,因为正如温斯顿·丘吉尔所说:无论策略多么美好,你都应该偶尔看看结果。

富国沪深

您可以将 try 和 catch 与 DB:transaction() 一起使用。try {        //start the transaction        DB::beginTransaction();        //You code        //commit the transaction        DB::commit();} catch (\Exception $e) {        DB::rollBack();        return response;}希望这可以帮助
随时随地看视频慕课网APP
我要回答