首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >springboot在每次调用存储过程后手动提交

springboot在每次调用存储过程后手动提交
EN

Stack Overflow用户
提问于 2020-08-11 22:48:58
回答 1查看 330关注 0票数 0

我有一个springboot应用程序,它需要迭代大量的记录,并调用一个存储过程,该存储过程为每次读取的记录在表中插入一些数据。

我们不能使用BatchUpdate,因为它需要很长时间来处理数以千计的记录,我经常被要求提交(在每条记录之后或在x条记录之后)

我在网上寻找,我没有看到一个很好的例子,说明如何在springboot中手动提交,同时在循环中调用存储过程。我使用的是SimpleJdbcCall,我的代码如下所示:

代码语言:javascript
复制
@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处理事务,那么在它处理的过程中,如果我确实读取了未提交的内容,那么我可以看到表中的记录,但是直到整个作业结束时,这些记录才会被提交。我做错了什么,阻止了在每一行之后发生提交?

EN

回答 1

Stack Overflow用户

发布于 2020-08-13 20:28:29

我最终使用以下命令将对SP的调用分离到不同的方法中

代码语言:javascript
复制
@Transactional(propagation = Propagation.REQUIRES_NEW)

这样,当它从方法返回时,就会提交。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63360724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档