gpt4 book ai didi

php - Laravel 事务回滚似乎不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 10:36:57 24 4
gpt4 key购买 nike

我正在运行 laravel 5.4 并注意到事务中的回滚不起作用。我在 settings.php 文件中将我的数据库引擎设置为 InnoDB 并尝试了 DB::rollback();DB::rollBack();(即大写和小写 b)但它不会回滚我的数据库。

我在下面写了一个单元测试。它创建一条记录,提交它,然后回滚。但是,最后一个断言失败了。回滚后,数据库中仍然有记录。有什么我想念的吗?还是 laravel 存在错误?

public function testRollback()
{
$this->artisan('migrate:refresh', [
'--seed' => '1'
]);

DB::beginTransaction();

Season::create(['start_date' => Carbon::now(), 'end_date' => Carbon::now(),]);
DB::commit();
$this->assertDatabaseHas('seasons', [
'start_date' => Carbon::now(), 'end_date' => Carbon::now(),
]);

DB::rollBack();
// This assertion fails. It still finds the record after calling roll back
$this->assertDatabaseMissing('seasons', [
'start_date' => Carbon::now(), 'end_date' => Carbon::now(),
]);
}

最佳答案

交易包括三个步骤:

你用 DB::beginTransaction 或 MySQL 等效的 BEGIN TRANSACTION 启动它,然后你执行你需要的命令,然后(这是重要的部分)你 < strong>或者 COMMIT 或者 ROLLBACK

但是,一旦您提交了事务,就无法再将其回滚。

将测试更改为:

public function testRollback()
{
$this->artisan('migrate:refresh', [
'--seed' => '1'
]);

DB::beginTransaction();

Season::create(['start_date' => Carbon::now(), 'end_date' => Carbon::now(),]);

$this->assertDatabaseHas('seasons', [
'start_date' => Carbon::now(), 'end_date' => Carbon::now(),
]);

DB::rollback();

$this->assertDatabaseMissing('seasons', [
'start_date' => Carbon::now(), 'end_date' => Carbon::now(),
]);
}

这应该有效,因为在事务回滚之前,数据库“认为”记录在那里。

在实践中使用事务时,您希望使用 the docs 中的建议,例如:

DB::transaction(function()
{
DB::table('users')->update(array('votes' => 1));

DB::table('posts')->delete();
});

这将确保包装操作的原子性,并在函数体内抛出异常时回滚(如果需要,您也可以抛出自己作为中止的一种方式)。

关于php - Laravel 事务回滚似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46617452/

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