在jdbcTemplate或DataSource上提交

时间:2015-08-13 08:40:23

标签: spring spring-jdbc

我想使用jdbcTemplate进行提交和回滚。

我的问题基于this thread

如何在jdbcTemplate上执行或回滚,如

jdbcTemplate.commit();
jdbcTemplate.rollback();

或者还有一些其他方法可以使用jdbcTemplate实现提交和回滚功能。

5 个答案:

答案 0 :(得分:7)

要调用commitrollback,将以编程方式设置事务边界,而不是以声明方式设置。

出于这个原因,你必须抓住PlatformTransactionManager - 注入你DAO中的那个并自己执行commit / rollback操作。

示例代码:

@Autowired private JdbcTemplate jdbcTemplate;
@Autowired private PlatformTransactionManager platformTransactionManager;

 //..

public void daoMethod(params) {
  DefaultTransactionDefinition paramTransactionDefinition = new    DefaultTransactionDefinition();

  TransactionStatus status=platformTransactionManager.getTransaction(paramTransactionDefinition );
try{
  String sqlQuery = "query";
  jdbcTemplate.update(sqlQuery, params);
  platformTransactionManager.commit(status);
}catch (Exception e) {
  platformTransactionManager.rollback(status);
}

另一种方法是掌握TransactionTemplate

示例代码:

@Autowired private JdbcTemplate jdbcTemplate;
@Autowired private TransactionTemplate transactionTemplate;

//..


//for operations where query does not return like delete
public void daoMethod(params) {
  transactionTemplate.execute(new TransactionCallbackWithoutResult() {
    protected void doInTransactionWithoutResult(TransactionStatus paramTransactionStatus) {
    try{
      String sqlQuery = "query";
      jdbcTemplate.update(query, params);
    }catch (Exception e) {
      paramTransactionStatus.setRollbackOnly();
    }
    }
  });
}

//for operations where query does return like insert
public int daoMethod(params) {
return  transactionTemplate.execute(new TransactionCallback<Integer>() {
  public Integer doInTransaction(TransactionStatus paramTransactionStatus) {
    String sqlQuery = "query";
    Object[] params = params;
    int[] types = myTypes;
    return jdbcTemplate.update(sqlQuery,params,types);
   }
 });
}}

答案 1 :(得分:6)

使用@Transactional。但是,当然,在此之前,您必须为DataSourceTransactionManager

创建bean定义
// Your DataSource bean definition
@Bean
public DataSource dataSource() {
    ....
}

// Transaction manager bean definition
@Bean
public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource) {
    DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
    dataSourceTransactionManager.setDataSource(dataSource);

    return dataSourceTransactionManager;
}

然后你可以使用@Transactional。服务示例:

@Service
public class MyServiceImpl {

    @Autowired
    private MyDAO myDAO;

    @Transactional
    public void insert(Entity entity) {
       myDAO.insert(entity);
    }
}

答案 2 :(得分:1)

在Spring中管理事务的最简单方法是@Transactional注释,所以你的代码看起来很简单:

@Transactional(rollbackFor = Exception.class)
public void doSomething(...) {
    ...
}

了解详情:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html

答案 3 :(得分:0)

如果您已正确配置了spring transaction manager / jdbcTemplate,那么您可以始终使用spring提供的@Transactional注释来定义何时回滚事务。但即使你已经定义了回滚并且你的jdbc驱动程序或你的数据库不允许事务(检查TRANSACTION_ISOLATION而不是JdbcConnection),那么spring将使用事务记录,但数据库将忽略这些点。

答案 4 :(得分:0)

DOM