谁一开始就是大神?

批量插入的时候,事务不起作用.[2.0]

public function actionImport()
{
    try {
        $columns_keys = [];
        $columns = Yii::$app->db->getTableSchema('_crm_product')->columns;
        foreach ($columns as $column) {
            $columns_keys[$column->comment] = $column->name;
        }
        unset($columns);
        
        // web 目录下
        $pFilename = trim(Yii::$app->request->get('filename'), '/');
        // 先用 Reader_Excel2007 读取
        $PHPReader = new \PHPExcel_Reader_Excel2007();
        // 当前的 Reader_Excel2007 可以阅读该文件吗?
        if (! $PHPReader->canRead($pFilename)) {
            // 再用 Excel5 读取
            $PHPReader = new \PHPExcel_Reader_Excel5();
            // 当前的 Reader_Excel5 可以阅读该文件吗?
            if (! $PHPReader->canRead($pFilename)) {
                return $this->error('无法读取该文件');
            }
        }
        // 载入 xls,xlsx 文件
        $PHPExcel = $PHPReader->load($pFilename);
        // 获得活动表
        $objActiveSheet = $PHPExcel->getActiveSheet();
        // 行迭代器
        $rows = [];
        foreach ($objActiveSheet->getRowIterator() as $row) {
            // 单元格迭代器
            $cellIterator = $row->getCellIterator();
            // 将迭代器设置为只循环存在的单元格, false=不存在
            $cellIterator->setIterateOnlyExistingCells(false);
            foreach ($cellIterator as $key => $cell) {
                if ($row->getRowIndex() == 1) {
                    $columns[] = $columns_keys[$cell->getValue()];
                } else {
                    $rows[$row->getRowIndex()][] = trim($cell->getValue(), '\' ="/');
                }
            }
        }
    } catch (ErrorException $e) {
        return $this->error('错误号:' . $e->getCode() . '<br>错误行:' . $e->getLine() . '<br>错误信息:' . $e->getMessage());
    }
    // 在主服务器连接上开始事务
    $db = Yii::$app->db;
    $transaction = $db->beginTransaction();
    try {
        $queryBuilder = $db->queryBuilder;
        $chunk_rows = array_chunk($rows, 5000);
        $count = 0;
        foreach ($chunk_rows as $chunk_row) {
            $sql = $queryBuilder->batchInsert('_crm_product', $columns, $chunk_row);
            $count += $db->createCommand($sql)->execute();
        }
        $message = '成功导入 <code>' . $count . '</code> 条记录';
        // 提交记录
        $transaction->commit();
        return $this->ok($message);
    } catch (Exception $e) {
        // 记录回滚
        $transaction->rollBack();
        return $this->error('错误号:' . $e->getCode() . '<br>错误信息:' . $e->getMessage());
    }
}

检查是否使用了innodb存储引擎

赞(0) 打赏
未经允许不得转载:菜鸟之家 » 批量插入的时候,事务不起作用.[2.0]

评论 抢沙发

登录

找回密码

注册