首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么JDBCTEmplate.batchupdate(sql[])方法不使用@transaction注释在Spring4中回滚?

为什么JDBCTEmplate.batchupdate(sql[])方法不使用@transaction注释在Spring4中回滚?
EN

Stack Overflow用户
提问于 2014-09-16 10:39:05
回答 3查看 9K关注 0票数 2

当在数据库中插入记录时发生异常时,下面的代码不适用于回滚。我使用Spring 4框架和注释。

*/我正在使用下面的代码进行事务管理,它不会在任何异常情况下回滚。

代码语言:javascript
复制
@Transactional(rollbackFor = RuntimeException.class)
public boolean insertBatch(List<String> query) throws SQLException   {
    boolean flag= false;
    try
    {
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

        String[] Sql= query.toArray(new String[query.size()]);
        jdbcTemplate.batchUpdate(Sql);

        flag=true;

    }catch(DataAccessException e )
    {
        flag=false;
        MessageResource.setMessages("Constraints Violation ! CSV data value not matched with database constraints  ");
        LOGGER.info("CSV file Data not  expected as  database table structure defination like constraint violation/Data Type lenght/NUll etc for same data value" );
        LOGGER.error( "Cause for error:  "+  e.getRootCause().getMessage());
        LOGGER.debug( "Details explain : "+  e.toString());
        throw new RuntimeException("Roll back operation");
        //transactionManager.rollback(status);

    }
         return flag;


}**
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-17 04:37:40

由Sir、M.Deinum提供的Actullay如下:

Spring使用代理来应用AOP,这只适用于外部调用的方法。内部方法调用不会通过代理,因此不会进行事务处理,根据查询的不同,您将得到一个较大或多个较小的提交。确保外部方法(调用启动一切的方法)是事务性的。- 14小时前

票数 2
EN

Stack Overflow用户

发布于 2014-09-16 10:44:59

代码语言:javascript
复制
@Transactional(rollbackFor = RuntimeException.class)

只有当从带注释的方法引发RuntimeException或子类时,这才会回滚。如果您想回滚任何Exception (例如SQLException,即而不是a RuntimeException),您应该这样做:

代码语言:javascript
复制
@Transactional(rollbackFor = Exception.class)

如果您想要对可能发生的任何错误进行回滚

代码语言:javascript
复制
@Transactional(rollbackFor = Throwable.class)

同样,在最后一种情况下,运行时可能会被破坏到连回滚都无法完成。

票数 0
EN

Stack Overflow用户

发布于 2022-02-05 10:50:00

使用来自connection对象的预准备语句和do执行批处理对象。在连接对象上使用conn.setAutoCommit(false)。对于1000条记录的批量插入,前置语句的性能是JdbcTemplate的4倍。

参考资料:JdbcTemplate.batchUpdate() returns 0, on insert error for one item but inserts the remaining item into sql server db despite using @Transactional

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

https://stackoverflow.com/questions/25866593

复制
相关文章

相似问题

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