事务分 编程式和声明式两种
在同一个类中调用声明式事务方法是没用的,无法回滚的,需要不同的类,比如在B类中向A类抛异常
声明式事务@Transactional(value = "jtaTransactionManager", rollbackFor = Exception.class) //不赋值的话默认为RuntimeException才回滚,value为指定的事务管理器
同一个类中的事务可以使用编程式事务处理
@Autowired
private TransactionTemplate transactionTemplate;
protected void batchDeal() {
transactionTemplate.execute(status -> {
try {
//业务处理
} catch (Exception e) {
logger.info("批量处理异常:", e);
status.setRollbackOnly();
} finally {
}
return null;
});
}
//@Configuration启动容器+@Bean注册Bean,Environment中含有spring配置文件读取的属性,@Primary告诉spring在犹豫的时候优先选择哪一个具体的实现(按类型注入不知道注入哪个的时候),@Qualifier和@Resource感觉没太大区别,不过可以用在参数代码更简洁
@Configuration
public class TransactionConfiguration {
private static final String MYSQL_PREFIX = "spring.datasource.hikari.m.";
@Bean(name = "mysql_data_source")
@Primary
@Autowired
public DataSource mysqlDataSource(Environment environment) {
PoolProperties poolProperties = new PoolProperties();
poolProperties.setDriverClassName(environment.getProperty(MYSQL_PREFIX + "driverClassName"));
poolProperties.setUrl(environment.getProperty(MYSQL_PREFIX + "url"));
poolProperties.setUsername(environment.getProperty(MYSQL_PREFIX + "username"));
poolProperties.setPassword(PasswordUtil.getPasswordByKey(PasswordKeyConstants.PHUCP_DB_MYSQL_PD));
poolProperties.setTestWhileIdle(environment.getProperty("spring.datasource.test-while-idle", Boolean.class));
poolProperties.setValidationQuery(environment.getProperty("spring.datasource.validation-query"));
return new DataSource(poolProperties);
}
@Bean(name = "jtaTransactionManager")
@Primary
public DataSourceTransactionManager jtaTransactionManager(@Qualifier("mysql_data_source")DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "jtaTransactionTemplate")
@Primary
public TransactionTemplate jtaTransactionTemplate (@Qualifier("jtaTransactionManager")DataSourceTransactionManager jtaTransactionManager) {
return new TransactionTemplate(jtaTransactionManager);
}
}