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;
}
目录
相关文章
|
1月前
|
SQL Java 数据库连接
深入 MyBatis-Plus 插件:解锁高级数据库功能
Mybatis-Plus 提供了丰富的插件机制,这些插件可以帮助开发者更方便地扩展 Mybatis 的功能,提升开发效率、优化性能和实现一些常用的功能。
216 26
深入 MyBatis-Plus 插件:解锁高级数据库功能
|
1月前
|
SQL 安全 Java
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
30 1
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
|
1月前
|
数据库连接 Go 数据库
Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性
本文探讨了Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性;防御编程则强调在编码时考虑各种错误情况,确保程序健壮性。文章详细介绍了这两种技术在Go语言中的实现方法及其重要性,旨在提升软件质量和可靠性。
32 1
|
27天前
|
SQL Java 数据库连接
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
|
2月前
|
数据库
什么是数据库的事务隔离级别,有什么作用
【10月更文挑战第21】什么是数据库的事务隔离级别,有什么作用
26 3
|
2月前
|
存储 关系型数据库 数据挖掘
什么是数据库的事务隔离级别
【10月更文挑战第21】什么是数据库的事务隔离级别
37 1
|
2月前
|
存储 数据库 数据库管理
数据库事务安全性控制如何实现呢
【10月更文挑战第15天】数据库事务安全性控制如何实现呢
|
2月前
|
存储 数据库 数据库管理
什么是数据库事务安全性控制
【10月更文挑战第15天】什么是数据库事务安全性控制
|
2月前
|
供应链 数据库
数据库事务安全性控制有什么应用场景吗
【10月更文挑战第15天】数据库事务安全性控制有什么应用场景吗
|
2月前
|
SQL 关系型数据库 数据库
如何在数据库中实现事务控制呢
【10月更文挑战第15天】如何在数据库中实现事务控制呢
29 1