tp5或tp5.1使用了事务,即使事务报错也有部分数据被写入的情况

在tp5或者tp5.1的事务中踩了不少坑,所以在这里分享一下自己趟过的坑。
tp事务中遇到过不少的情况导致事务没有正确回滚的。

  1. tp5及tp5.1如果没有任何数据更新是不会报错的,这个坑可以详细参考我之前的一篇博客文章: tp5或tp5.1中启用了事务,但没有正确回滚

  2. 基于mysql的事务特性:事务必须是在同一个数据库连接中才能生效。tp5.*中的事务也必须在同一个数据库连接当中。
    但是!重点来了,如果在tp5.*的模型属性中配置了$connection属性(这个属性的用途大家可以自行到开发手册上查)就会导致每次实例化不同模型的时候,就会创建不同的数据库连接,导致事务并未在同一个数据库连接中执行,自然就会导致事务无法正确回滚。

举个栗子:

//假设模型A、模型B都配置了$connection属性
$modelA = new A();
$modelB = new B();
Db::startTrans();
try{
	$modelA->save(['aaa'=>123])
	$modelB->save(['bbb'=>321])
  Db::commit();
}catch (\Exception $e){
  Db::rollback();
}
//上面的事务如果出错了是无法正确回滚的,因为$modelA和$modelB不在同一个事务当中。

解决方案1:不配置$connection属性
解决方案2:如果一定要配置$connection属性(一般用于多数据库的情况下)
要一个个模型的开启、回滚事务:

//假设模型A、模型B都配置了$connection属性
$modelA = new A();
$modelB = new B();

$modelA::startTrans();
$modelB::startTrans();
try{
	$modelA->save(['aaa'=>123])
	$modelB->save(['bbb'=>321])
	
	$modelA::commit();
	$modelB::commit();
}catch (\Exception $e){
	$modelA::rollback();
	$modelB::rollback();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值