账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    为什么MySQL事务在PHP循环里不回滚?
    29
    0

    引擎是innodb。
    代码如下

            try{
                // …… ……一些代码
                 
                $this->model->begin();
                if(!empty($goods_info) && !empty($shelf_num)){
                    $order_arr['total_money'] = 0;
                    $order_arr['good_num'] = 0;
    
                    //根据传递商品编号及编号下的数量信息,循环插入订单详情表
                    foreach ($goods_info as $val) {
                        $good_data = $this->model->findByid($val[0],array('price'));//查找商品价格信息
                        if(!empty($good_data) && $good_data[0]['price'] == $val[2]){
                        
                            $order_arr['total_money'] += $val[2]*$val[1];//订单总金额
                            $order_arr['good_num']    += $val[1];//订单商品总数
                            $order_detail['barcode']   = $val[0];//商品编号
                            $order_detail['good_num']  = $val[1];//商品数量
                            $order_detail['price']     = $val[2];//商品价格
                            $this->model->create();
                            $this->model->save($order_detail);//保存到订单详情表
                            
                        }else{
                            throw new Exception('001');
                        }
                        
                    }
    
                  // …… …… 一些代码
                  
                $this->model->commit();
                $this->model->end();
                
            }catch(Exception $e) {
                $this->model->rollback();
                $arrData = $e->getMessage();
                echo $arrData;
            }
            
            
            
      
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 振翅的蚂蚁 普通会员 1楼

      在MySQL中,事务是用于控制和管理数据库操作的一组规则。如果在循环中执行事务,MySQL会自动回滚事务以防止数据丢失。但是,在PHP循环中不回滚事务,可能是由于以下原因:

      1. PHP循环的执行方式不同:在PHP中,数据库操作通常是在循环的内部执行的,而MySQL事务是在数据库服务器中执行的。因此,如果在循环中执行事务,MySQL服务器将自动回滚事务以防止数据丢失。

      2. 错误处理机制:PHP有一些错误处理机制,例如try-catch块和finally块。在这些机制中,如果错误发生,程序将跳转到错误处理块。如果在循环中执行事务,程序可能会因为错误而跳过或者延迟执行事务。

      3. 多线程环境:在多线程环境下,如果在循环中执行事务,程序可能会因为多个线程同时执行事务而引起冲突。在这种情况下,MySQL服务器可能会自动回滚事务以防止数据丢失。

      为了避免在PHP循环中不回滚事务,你可以考虑以下几种方法:

      1. 在循环内部处理事务,避免在循环中执行事务。

      2. 使用try-catch块和finally块来处理错误,确保在出现错误时程序能够正常执行。

      3. 在多线程环境下,使用锁或其他同步机制来确保事务的执行顺序。

      4. 使用事务回滚语句,例如TRX乎重(BEGIN, COMMIT, ROLLBACK),以确保事务的正确执行。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部