gpt4 book ai didi

php - 具有多个提交的 Laravel DB 事务?

转载 作者:行者123 更新时间:2023-11-29 01:36:17 26 4
gpt4 key购买 nike

我可以在数据库交易过程中做一些检查点吗?

比如事务开始的时候,我有很多查询,更新,删除等等。

DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
// something else here
DB::table('posts')->delete();
});

据我了解,这种功能会在成功时自动提交所有内容,并在出现问题时自动回滚。

但是有没有可能在出现错误的情况下不回滚一切,例如,像

DB::table('users')->update(['votes' => 1]);
// something else here
DB::if_successful_so_far_do_not_rollback_previous_lines();
DB::table('posts')->delete();

是否存在任何“小的内部提交”?

最佳答案

是的,你可以。但这也取决于您使用的数据库。

Laravel 支持嵌套事务。这接近您的需要。

要隔离内部事务,您必须将其包装在 try-catch block 中。因此,如果内部事务抛出异常,它将不会到达外部事务,因此继续该过程。但是如果外层事务抛出Exception,整个事务(包括它的嵌套事务)都会回滚。

所以你最终会得到这样的结果:

public function testNestedTransactions()
{

$user = EloquentTestUser::create(['email' => 'taylor@laravel.com']);

$this->connection()->transaction(function () use ($user) {

try {
$this->connection()->transaction(function () use ($user) {
$user->email = 'otwell@laravel.com';
$user->save();
throw new Exception;
});
} catch (Exception $e) {}

$user = EloquentTestUser::first();
$this->assertEquals('taylor@laravel.com', $user->email);

});

}

这是 Otwell 在 this commit implementing the functionality of nested transactions in Laravel 中编写的测试.他首先创建一个用户,然后使用嵌套事务启动事务,他在其中更新用户电子邮件,然后抛出异常(意味着发生了错误)。就在它下面,他检查用户电子邮件是否与他创建时一样,结果确实如此,因为嵌套事务已回滚,但外部事务仍在进行。

关于php - 具有多个提交的 Laravel DB 事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42782795/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com