我有一个springboot应用程序,它需要迭代大量的记录,并调用一个存储过程,该存储过程为每次读取的记录在表中插入一些数据。
我们不能使用BatchUpdate,因为它需要很长时间来处理数以千计的记录,我经常被要求提交(在每条记录之后或在x条记录之后)
我在网上寻找,我没有看到一个很好的例子,说明如何在springboot中手动提交,同时在循环中调用存储过程。我使用的是SimpleJdbcCall,我的代码如下所示:
@Transactional(isolation = Isolation.READ_UNCOMMITTED,propagation = Propagation.NOT_SUPPORTED)
public class EventsProcessor
{
@Autowired
@Qualifier("dbDatasource")
DataSource dataSource;
public void process(List<Event> events) throws Exception
{
SimpleJdbcCall dbTemplate = new SimpleJdbcCall(dataSource).withProcedureName("UPDATE_EVENTS").withSchemaName("TEST");
DataSourceUtils.getConnection(dataSource).setAutoCommit(false);
for (Event ev : events)
{
//fill inParams here
outParams = dbTemplate.execute(inParams);
DataSourceUtils.getConnection(dataSource).commit();
}
}
}我尝试了不使用Propagation.NOT_SUPPORTED和使用它,但结果是一样的。代码正在执行对sp的调用,并且在执行commit()时没有错误,但是在commit()之后,如果我查询表,表明sp在其中插入了记录,我看不到表中的记录。
如果我删除了setAutocommit(false)、commit语句和Propagation.NOT_SUPPORTED,而只是让springboot处理事务,那么在它处理的过程中,如果我确实读取了未提交的内容,那么我可以看到表中的记录,但是直到整个作业结束时,这些记录才会被提交。我做错了什么,阻止了在每一行之后发生提交?
发布于 2020-08-13 20:28:29
我最终使用以下命令将对SP的调用分离到不同的方法中
@Transactional(propagation = Propagation.REQUIRES_NEW)这样,当它从方法返回时,就会提交。
https://stackoverflow.com/questions/63360724
复制相似问题