Yii2 php循环使用mysql事务

发布于 2022-09-07 12:28:47 字数 429 浏览 24 评论 0

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) 如果抛异常了,会导致部分数据没有办法进行操作了。最外层加事务?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

当梦初醒 2022-09-14 12:28:47

需要保证所有的数据都同时操作成功,或者同时操作失败。 是指如果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 进行其他操作
森末i 2022-09-14 12:28:47

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文