本次交易包括三个步骤:
您与DB::beginTransaction或MySQL等同BEGIN TRANSACTION,那么你执行你需要,然后命令(在这里是最重要的部分),你要么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();
});
这将确保包装操作的原子,如果有异常的函数体中抛出将回滚(你如果需要的话,也可以将自己作为中止的手段)。