跳到主要内容

Spring编程式事务

直接使用@Transactional注解可能无法满足对事务力度的精确控制需求。因此,编程式事务管理成为了一种更可靠的选择

使用事务管理器

配置:

配置类Configuration,在其中注入了一个名为platformTransactionManager的事务管理器。事务管理器的主要作用是控制连接,因此需要将数据源dataSource注入到事务管理器中。

@Configuration
public class TransactoionConfig {

@Bean
public PlatformTransactionManager platformTransactionManager(DataSource dataSource) {
DataSourceTransactionManager platformTransactionManager = new DataSourceTransactionManager();
platformTransactionManager.setDataSource(dataSource);
return platformTransactionManager;
}
}

使用:

public void save() {
TransactionStatus transaction = transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
jdbcTemplate.execute("INSERT INTO user (id, name) VALUES (6, 'Jack6')");
int i = 1 / 0;
transactionManager.commit(transaction);
} catch (DataAccessException e) {
log.error(e.getMessage());
transactionManager.rollback(transaction);
}
}

创建一个默认的事务定义DefaultTransactionDefinition,然后通过事务管理器的getTransaction方法开启事务,并获取事务状态TransactionStatus。在执行事务性操作时,使用try-catch块来捕获异常。如果操作成功,调用transactionManager.commit提交事务;如果出现异常,调用transactionManager.rollback回滚事务。

使用TransactionTemplate

Spring 还提供了一个工具类TransactionTemplate,可以更方便地进行事务控制。

@Autowired
private TransactionTemplate transactionTemplate;

public void save(User user) {
jdbcTemplate.execute("INSERT INTO user (id, name) VALUES (5, 'Jack5')");

transactionTemplate.execute((status) -> {
jdbcTemplate.execute("INSERT INTO user (id, name) VALUES (6, 'Jack6')");
int i = 1 / 0;
return Boolean.TRUE;
});

}

execute方法执行事务回调函数TransactionCallback。在回调函数中,执行事务性操作,如果操作成功,无需显式提交事务,TransactionTemplate会自动处理;如果出现异常,可以通过transactionStatus.setRollbackOnly设置回滚标志。

可以看一下源码:

image-20240902103916544