为啥mybatis插入一条数据的时候必须的提交事务
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥mybatis插入一条数据的时候必须的提交事务相关的知识,希望对你有一定的参考价值。
参考技术A 首先你需要明白事务的概念,目的是为了保持数据的一致性。mybatis中,默认不开启事务的自动提交,所以你insert了,但是系统认为你的一连串操作没有完成,为了保障数据的一致性,系统不会加入这条新的数据,只有当你手动提交的时候,数据库才会加入数据本回答被提问者采纳
MyBatis批量插入为什么比单条插入块?
今天在利用excel处理业务数据的时候开始打算一条一条插入数据库!因为要做数据校验和数据保存返回id之后进行其他表也插入!大约有30000多条数据库吧!花了大约3-5分钟,前端也会出现超时请求问题、让我意识到一条一条插入影响性能,但是因为业务逻辑的需要,又不得不一条一条插入,后面改变了思维还是必须批量插入数据!并将其他表也需要保存的数据也临时存在Java对象中!在主对象保存之后进行遍历获取插入。
一条一条数据插入为什么会这么慢呢?如果是单条执行数据操作,比如有30000条数据,那么你得向数据库服务器发起30000次请求!如果使用批量插入就只需要发送一次请求。
其实就像前端发送http请求一样,在请求的时候消耗花费了很多时间。
直接看一下批量保存的源代码吧
public boolean saveBatch(Collection<T> entityList, int batchSize)
String sqlStatement = this.sqlStatement(SqlMethod.INSERT_ONE);
SqlSession batchSqlSession = this.sqlSessionBatch();
Throwable var5 = null;
try
int i = 0;
for(Iterator var7 = entityList.iterator(); var7.hasNext(); ++i)
Object anEntityList = var7.next();
batchSqlSession.insert(sqlStatement, anEntityList);
if(i >= 1 && i % batchSize == 0)
batchSqlSession.flushStatements();
batchSqlSession.flushStatements();
return true;
catch (Throwable var16)
var5 = var16;
throw var16;
finally
if(batchSqlSession != null)
if(var5 != null)
try
batchSqlSession.close();
catch (Throwable var15)
var5.addSuppressed(var15);
else
batchSqlSession.close();
这里 batchSqlSession.flushStatements()其实就是在做拼接SQL的操作!将单个插入的方法为每个实体组装一个insert 语句,然后执行数据库插入操作
以上是关于为啥mybatis插入一条数据的时候必须的提交事务的主要内容,如果未能解决你的问题,请参考以下文章
一个事务中先插入数据,然后再查询所有数据,能查到刚才的记录吗
spring+mybatis 多数据库事务管理:一个方法里面能同时对两个数据库的数据进行操作