JdbcTemplate能否开启事务?使用Statement手动开启事务

本文讨论了在项目中对接第三方数据时遇到的挑战,包括数据量大时的性能问题、无状态和更新时间数据的同步难题,以及JdbcTemplate无法自动开启事务的情况。作者尝试了手动使用Statement开启事务并处理批量删除,同时提到了批量执行的限制。
摘要由CSDN通过智能技术生成

一、需求背景

项目中经常会去对接第三方的数据,将对方的用户组织等信息同步过来,此时会遇到几个问题就是数据量大的时候性能问题,数据部分更新时又该怎么同步,但这些数据基本都有状态和更新时间,根据该两个值去新增和更新即可,但是最近遇到一个即没有更新时间也没有状态的表,这样子导致没法增量更新,删除了的数据也没法同步,只能每次删除全量的数据然后重新获取

二、JdbcTemplate无法开启事务(存疑)

首先先说JdbcTemplate无法开启事务,百度之后网友说在方法上添加注解
@Transactional即可,区别是网友用的是xml去说明这个JdbcTemplate,而我是手动去set这个JdbcTemplate

BasicDataSource dataSource = new BasicDataSource();
        //jdbc driver类
        dataSource.setDriverClassName(domainDriverClassName);
        //url
        dataSource.setUrl(http://localhost:3306);
        //用户名
        dataSource.setUsername(domainUserName);
        //密码
        dataSource.setPassword(domainPassword);
        dataSource.setDefaultTransactionIsolation(2);
        dataSource.setRemoveAbandonedOnBorrow(true);
        dataSource.setRemoveAbandonedOnMaintenance(true);
        dataSource.setRemoveAbandonedTimeout(300);
        dataSource.setLogAbandoned(false);
        dataSource.setMaxTotal(dsMaxTotal);
        dataSource.setMinIdle(2);
        dataSource.setMaxWaitMillis(30000);
     JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(dataSource);

然后在方法前添加@Transactional注解,但是不生效,这里有个小知识点,ddm语句是不会回滚的

jdbcTemplate.execute("truncate table db_gx_lineage_data");
int i = 1/0;

虽然方法前加了注解,但是执行到1/0的时候报错,但是并没有回滚,一开始以为是ddm语句无法回滚的问题,后续又把truncate换成delete,但是发现仍然不会回滚,数据库的数据还是被删除了,广大的网友们,知道jdbcTemplate怎么开启事务的欢迎留言交流

三、使用Statement手动开启事务
        Connection connection = dataSource.getConnection();
        connection.setAutoCommit(false);
        Statement statement = connection.createStatement();
        statement.execute("delete from db_gx_lineage_data");

statement也可以执行批量任务,其中有个addBatch(Sql)的方法,可以一直往里面添加sql然后批量执行executeBatch()方法即可,这里有个问题就是,批量执行有个条数上线,根据网友描述一次只能5w+条一起执行,多了的会被忽略掉

JdbcTemplate是Spring框架中提供的一个对象,用于简化对关系型数据库的操作。它还提供了事务处理的功能。下面是JdbcTemplate处理事务的步骤[^1]: 1. 创建JdbcTemplate对象:首先,需要创建一个JdbcTemplate对象,并设置数据源(DataSource)。 ```java JdbcTemplate jdbcTemplate = new JdbcTemplate(); jdbcTemplate.setDataSource(dataSource); ``` 2. 配置事务管理器:接下来,需要配置一个事务管理器(TransactionManager),用于管理事务的开始、提交和回滚。 ```java PlatformTransactionManager transactionManager = new DataSourceTransactionManager(dataSource); ``` 3. 开启事务:在需要进行事务处理的方法上,使用@Transactional注解来标记该方法需要进行事务管理。 ```java @Transactional public void performTransaction() { // 事务处理的代码 } ``` 4. 执行事务操作:在标记了@Transactional注解的方法中,可以执行数据库的增删改查操作,JdbcTemplate会自动管理事务的开始、提交和回滚。 ```java public void performTransaction() { jdbcTemplate.update("INSERT INTO table_name (column1, column2) VALUES (?, ?)", value1, value2); jdbcTemplate.update("UPDATE table_name SET column1 = ? WHERE column2 = ?", value1, value2); // 其他数据库操作 } ``` 5. 提交或回滚事务:当方法执行完毕时,如果没有发生异常,则事务会被自动提交。如果发生异常,则事务会被回滚。 ```java @Transactional public void performTransaction() { try { // 事务处理的代码 } catch (Exception e) { // 异常处理 } } ``` 这样,通过JdbcTemplate事务管理器的配合,可以实现对数据库操作的事务管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值