<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.9</version>
</dependency>
<dependency>
<groupId>com.atomikos</groupId>
<artifactId>transactions</artifactId>
<version>4.0.6</version>
</dependency>
@Configuration
@EnableTransactionManagement
public class TransactionConfig {
@Bean
public PlatformTransactionManager transactionManager() {
JtaTransactionManager transactionManager = new JtaTransactionManager();
transactionManager.setTransactionManager(atomikosTransactionManager());
transactionManager.setUserTransaction(atomikosUserTransaction());
return transactionManager;
}
@Bean(destroyMethod = "shutdownForce")
public UserTransaction atomikosUserTransaction() {
UserTransactionImp userTransaction = new UserTransactionImp();
userTransaction.setTransactionTimeout(300);
return userTransaction;
}
@Bean(destroyMethod = "close")
public TransactionManager atomikosTransactionManager() {
AtomikosTransactionManager transactionManager = new AtomikosTransactionManager();
transactionManager.setForceShutdown(false);
transactionManager.setTransactionTimeout(300);
return transactionManager;
}
}
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional
public void createUser(User user) {
userRepository.save(user);
}
@Transactional
public void deleteUser(int userId) {
userRepository.deleteById(userId);
}
}
@Configuration
public class DataSourceConfig {
@Bean
public DataSource dataSource() {
AtomikosDataSourceBean dataSource = new AtomikosDataSourceBean();
dataSource.setUniqueResourceName("myDataSource");
dataSource.setXaDataSourceClassName("com.mysql.cj.jdbc.MysqlXADataSource");
dataSource.setXaProperties(buildProperties());
return dataSource;
}
private Properties buildProperties() {
Properties properties = new Properties();
properties.setProperty("URL", "jdbc:mysql://localhost:3306/mydb");
properties.setProperty("user", "root");
properties.setProperty("password", "password");
return properties;
}
}
@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)
public void updateUser(User user) {
userRepository.save(user);
}