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
设置回滚标志。
可以看一下源码: