关于数据库事务提交位置的疑惑
今天和同事在讨论关于事务这块,在事务提交位置发生了分歧,我也尝试了一下,不管是同事主张的写法,还是我的写法,都能达到效果,但是谁也说服不了谁,因此想请教一下,哪种方式更合理?实例代码:
// 我主张的写法。
public function test() {
DB::beginTransaction();
try {
$user = UserInfo::query()->create([
"name" => "李大",
"age" => 18
]);
$book = Book::query()->create([
"name" => "测试书籍1",
"user_id" => $user->id
]);
DB::commit();
if ($book) {
return("提交成功");
}
throw new Exception("提交失败");
} catch (Exception $exception) {
DB::rollback();
throw new Exception($exception->getMessage());
}
}
// 同事主张的写法:
public function test() {
DB::beginTransaction();
try {
$user = UserInfo::query()->create([
"name" => "李大asdadasdasd",
"age" => 18
]);
$book = Book::query()->create([
"name" => "测试书籍1",
"user_id" => $user->id
]);
if ($book) {
DB::commit();
return("提交成功");
}
throw new Exception("提交失败");
} catch (Exception $exception) {
DB::rollback();
throw new Exception($exception->getMessage());
}
}
我主张的写法理由是:返回的结果是在事务都提交成功以后去获取,并不需要在最后一个新增成功以后再去提交。事务本身就是都为真true
才会提交,有一个为false
就回滚并且抛出异常。
同事的理由是,使用server
,Repository
模式的时候,控制器调用server层的业务代码,会存在很多条件判断和保存不成功的情况,因此需要判断最后一个为true的时候才提交。
针对这一点,我提出的反驳是,如果在控制器层使用的try,catch
,server
层代码中有异常就可以抛出,这样的话就能及时捕获异常。
但是谁也说服不了谁,请问谁的主张更为合理一点,或者说针对的是不同的场景和业务?
推荐文章: