Yii2 php循环使用mysql事务

hi,各位好。
现在有十条数据需要插入,同时有十条数据需要更新。暂记需要插入的数据为a1,a2,a3...a10,需要更新的数据为b1,b2,b3...b10。

需要保证所有的数据都同时操作成功,或者同时操作失败。(即事务)。
而且需要将 a1插入后得到的主键ID更新到b1的一个字段,a2更新到b2的一个字段,依次类推。

我现在的做法是:

foreach($arr_a AS $a){
    //开启事务
    //插入 a1 得到 id1
    //将ID更新到 b1
    //结束事务或者回滚事务
}

但是这样的话会有几个问题:
(1) 循环里面使用事务会导致性能问题吧?
(2) 如果抛异常了,会导致部分数据没有办法进行操作了。最外层加事务?

请问大神有什么好的解决方法吗?求指导~感激不尽!

阅读 5.1k
2 个回答

需要保证所有的数据都同时操作成功,或者同时操作失败。 是指如果a10操作失败了,全部数据回滚到a1操作前吗?如果是这样的话,当然是吧事务放在循环外层最合适。

如果只是 “a1插入后得到的主键ID更新到b1的一个字段” 是一个事务,其中任意一组操作失败不影响其他组操作的话,还是应该将事务放在循环内。

// 用于记录失败的操作的key
$error = [];

foreach($arr_a AS $key => $a){
    $transaction = Yii::$app->getDb()->beginTransaction();

    try {
        //插入 a1 得到 id1
        //将ID更新到 b1
        
        $transaction->commit();
    } catch (\Exception $e) {

        // 回滚
        $transaction->rollBack();
        // 记录失败的操作的key
        $error[] = $key;

        // 这里不抛异常
        continue;
    }
}

// 对记录的 $error 进行其他操作

事务锁很耗性能,最好在循环的外面放事务,这样可以一起成功或者一起失败。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题