mysql 数据导入出错 如何全部回滚

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 数据导入出错 如何全部回滚相关的知识,希望对你有一定的参考价值。

我们经常会遇到操作一张大表,发现操作时间过长或影响在线业务了,想要回退大表操作的场景。在我们停止大表操作之后,等待回滚是一个很漫长的过程,尽管你可能对知道一些缩短时间的方法,处于对生产环境数据完整性的敬畏,也会选择不做介入。最终选择不作为的原因大多源于对操作影响的不确定性。实践出真知,下面针对两种主要提升事务回滚速度的方式进行验证,一种是提升操作可用内存空间,一种是通过停实例,禁用 redo 回滚方式进行进行验证。

仔细阅读过官方手册的同学,一定留意到了对于提升大事务回滚效率,官方提供了两种方法:一是增加 innodb_buffer_pool_size 参数大小,二是合理利用 innodb_force_recovery=3 参数,跳过事务回滚过程。第一种方式比较温和,innodb_buffer_pool_size 参数是可以动态调整的,可行性也较高。第二种方式相较之下较暴力,但效果较好。

两种方式各有自己的优点,第一种方式对线上业务系统影响较小,不会中断在线业务。第二种方式效果更显著,会短暂影响业务连续,回滚所有没有提交的事务。
参考技术A #在需要判断之前使用
BEGIN;
#在逻辑判断里判断

#成功使用提交
COMMIT;

#失败时使用回滚
ROLLBACK;

mybatis批量导入 ,出现异常全部不添加(回滚)

public int importModel(MultipartFile file) throws Exception
        String fileName = file.getOriginalFilename();
        String suffxName = fileName.substring(fileName.lastIndexOf(".",fileName.length()) );
        //System.out.println(fileName+",后缀名:"+suffxName);
        String prefix=fileName.substring(fileName.lastIndexOf("."));
        final File excelFile = File.createTempFile(UUID.randomUUID().toString(), prefix);
         //批量处理
        SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH,false);
        commericalModelMapper = session.getMapper(CommericalModelMapper.class);
        // MultipartFile to File
        file.transferTo(excelFile);
        //判断excelp版本
        Workbook workbook = null;
        if(suffxName.equals(".xlsx"))
            workbook = new XSSFWorkbook(new FileInputStream(excelFile));
        else
            workbook = new HSSFWorkbook(new FileInputStream(excelFile));
        
        int count = 0;
        if(workbook != null)
            //获取excel中的数据,转换为实体类
            Sheet sheet = workbook.getSheetAt(0);
            List<CommericalModel> commericalModelList = CommericalModelResult.excelToModel(sheet);
            int limitCount = 1000;
            //进行批量添加操作(有一条不成功,全部回滚)
            if(commericalModelList != null && commericalModelList.size() > 0)
                for(int i = 0 ; i < commericalModelList.size();i++)
                    CommericalModel commericalModel = commericalModelList.get(i);
                    commericalModel.setCreateDate(new Date());
                    commericalModel.setUpdateDate(new Date());
                    commericalModel.setModelIsDelete((short)1);
                    commericalModelMapper.insert(commericalModel);
                    /*if(i != 0 && i%limitCount == 0)
                        //数量达到1000提交一次
                        session.commit();
                     */
                    count++;
                
                session.commit();
            
        
        //删除临时文件
        if(excelFile.exists())
            excelFile.delete();
        
        return count;
    

  

SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH,false);
commericalModelMapper = session.getMapper(CommericalModelMapper.class);

commericalModelMapper.insert(commericalModel);
添加的时候使用这个,分批次导入,可以计入那行是错误的,返回;成功添加了多少行都可以处理

以上是关于mysql 数据导入出错 如何全部回滚的主要内容,如果未能解决你的问题,请参考以下文章

用navicat 8 for mysql导入某个数据表格时,数据无法全部导入,会出现提示以处理多少,错误多少,怎么回事

如何查看mysql 导入进度

将数据导入mysql中,总是提示“DROP TABLE IF EXISTS XXX(我的表名)”出错,求大神指导!!

网站搬家,导入数据库时出错,MYSQL

如何导入MySQL数据库?

使用hadoop将数据从Mysql导入hdfs时出错?