问题描述
我有一个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处理事务,则在处理过程中,如果我执行READ UNCOMMITTED,则可以在表中看到记录,但是它们会在整个工作结束之前不要承诺。 我在做什么错,阻止了在每一行之后进行提交?
解决方法
我最终用
将对SP的调用分成了另一种方法@Transactional(propagation = Propagation.REQUIRES_NEW)
这样,当它从方法返回时,它将提交。