JdbcTemplate添加事务(非配置)

最近在项目中会使用到多数据源,数据源太多了,所以采用的配置DataSource的方式,然后代码中使用JdbcTempate(dataSource)的方式。但是最近遇到一个问题,在使用jt.batchUpdate(sqls)时,发现如果有sql有误,jdbctempalte并不会回滚。由于代码框架很老,不再适合对每个数据源都配置DataSourceTransactionManager。最终在网上看见下面的方法,纪录一下:

public static void batchExecute(JdbcTemplate jt, List<String> sqlList) throws SQLException{
        
        if(sqlList.size() == 0) return;
        
        DefaultTransactionDefinition transactionDefinition = new DefaultTransactionDefinition();
        DataSourceTransactionManager dm = new DataSourceTransactionManager(jt.getDataSource());
        TransactionStatus tmp = dm.getTransaction(transactionDefinition);
                
        String[] sqls  =  new String[sqlList.size()];
        sqlList.toArray(sqls);
        try{
            jt.batchUpdate(sqls);
            dm.commit(tmp);     
        } catch (Exception e) {
            dm.rollback(tmp);
            throw new SQLException(e.getMessage());
        }   
    }

注意

由于spring的事务处理是按照 LIFO/stack behavior的方式进行的,所以在多个事务进行提交时必须按照上述规则进行,否则就会报上面异常

当你写了多个数据源事务时要遵循后进先出。否则会报出下面的错误

spring tranaction: Cannot deactivate transaction synchronization - not active

修改后代码

try{
    jt.batchUpdate(sqls);           
    jt2.batchUpdate(sqls2);
        dm2.commit(tmp2);
    dm.commit(tmp);
} catch (Exception e) {
    dm.rollback(tmp);
    dm2.rollback(tmp2);
}

参考
SpringJdbcTemplate添加事务支持

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 5.Spring的事务 通常情况下,J2EE有2种事务管理方式:全局事务和本地事务,2种事务都比较明显的缺陷。 全...
    FTOLsXD阅读 5,393评论 0 8
  • 这篇文章是基于我开发读写分离中间件和数据库智能运维平台时的经验总结而成。网上对数据库连接系统分析的文章非常少,甚至...
    彦帧阅读 10,457评论 0 4
  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 13,140评论 0 13
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 11,076评论 0 4
  • 11年前,刚参加完高考的我,面对一本厚厚的志愿填报指南,不知所措。我不清楚自己对什么专业感兴趣,也不知道学了这些专...
    乐活的聪头阅读 2,256评论 1 1