在 jdbcTemplate 或 DataSource 上提交

新手上路,请多包涵

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

我的问题是基于 这个线程

我应该如何提交或回滚,我应该在 jdbcTemplate 上做吗

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

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

原文由 Akhil 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 903
1 个回答

调用 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);
   }
 });
}}

原文由 dimitrisli 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题