MyBatis插入100w数据使用编程式事务造成数据库被锁原因

简介: MyBatis插入100w数据使用编程式事务造成数据库被锁原因
项目使用技术SpringBoot+MyBatis+Oracle

来自生产血淋淋的教训,请大家引以为戒

需求分析

有100w数据,需要通过接口导入数据库,数据库使用的oracle。

为了能够保证数据顺利的插入,进行了分批,并且,使用了编程式事务进行提交。

实现代码如下:

//如果自动提交设置为true,将无法控制提交的条数,改为最后统一提交,可能导致内存溢出
SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);
//不自动提交
try {
List<User> lists = new ArrayList<>(); 
    UserDao userDao = session.getMapper(UserDao.class);
    for (int i = 0; i < list.size(); i++) {
        lists.get(i)
        if(i == 0){
            continue;
        }
        if (i % 400 == 0 || i == list.size() - 1) {
            userDao.bacthUpdate(lists);        
            //手动每400条提交一次,提交后无法回滚
            session.commit();
            //清理缓存,防止溢出
            session.clearCache();
            lists = new ArrayList<>();
        }
    }
} catch (Exception e) {
    //没有提交的数据可以回滚
    session.rollback();
} finally {
    session.close();
}
  • 乍一看没有什么问题,最后一批也是顺利提交了。但是执行两次就把数据库锁定了两次。

起因

测试的时候是一条数据,执行了两次。当一条数据传入的时候,事务被开启,但是if判断直接将执行的这条数据跳出来了循环,并没有能够直接提交。
事务开启,不提交直接关闭

解决办法

if(list.size() != 1 && i == 0){
    continue;
}
目录
相关文章
|
3天前
|
文字识别 负载均衡 算法
视觉智能开放平台产品使用合集之人脸数据库已创建超过1000个人脸数据,怎么开通更多人脸数据库
视觉智能开放平台是指提供一系列基于视觉识别技术的API和服务的平台,这些服务通常包括图像识别、人脸识别、物体检测、文字识别、场景理解等。企业或开发者可以通过调用这些API,快速将视觉智能功能集成到自己的应用或服务中,而无需从零开始研发相关算法和技术。以下是一些常见的视觉智能开放平台产品及其应用场景的概览。
|
1天前
|
SQL 关系型数据库 数据管理
数据管理DMS产品使用合集之归档数据至其它MySQL数据库时,如何指定目的库
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
11 1
|
2天前
|
Linux 数据库
Linux安装达梦数据库达梦数据
Linux安装达梦数据库达梦数据
4 0
|
3天前
|
SQL 存储 Oracle
老程序员分享:petshop详解之二:PetShop数据访问层之数据库访问设计
老程序员分享:petshop详解之二:PetShop数据访问层之数据库访问设计
|
3天前
|
前端开发 JavaScript 小程序
Navicat使用导入向导批量插入数据到数据库
Navicat使用导入向导批量插入数据到数据库
|
3天前
|
存储 关系型数据库 MySQL
|
2天前
|
存储 关系型数据库 MySQL
|
2天前
|
存储 SQL 关系型数据库
|
3天前
|
SQL 运维 关系型数据库
|
3天前
|
存储 关系型数据库 MySQL