在jdbcTemplate或DataSource上提交

Akh*_*hil 13 java spring spring-jdbc

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

我的问题是基于这个主题

如何在jdbcTemplate上进行提交或回滚

jdbcTemplate.commit();
jdbcTemplate.rollback();
Run Code Online (Sandbox Code Playgroud)

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

dim*_*sli 8

要以编程方式调用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);
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是获取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);
   }
 });
}}
Run Code Online (Sandbox Code Playgroud)


Bra*_*zic 6

使用@Transactional.但是,当然,在此之前,您必须为以下内容创建bean定义DataSourceTransactionManager:

// 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;
}
Run Code Online (Sandbox Code Playgroud)

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

@Service
public class MyServiceImpl {

    @Autowired
    private MyDAO myDAO;

    @Transactional
    public void insert(Entity entity) {
       myDAO.insert(entity);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • SpringBoot 2中无需配置dataSourceTransactionManager (2认同)

Ana*_*eka 1

在spring中管理事务最简单的方法是@Transactional注解,所以你的代码看起来会非常简单:

@Transactional(rollbackFor = Exception.class)
public void doSomething(...) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

阅读更多:http ://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html