In a Spring-based application, the `DataSourceTransactionManager` is commonly used for managing transactions when working with a relational database. It is responsible for coordinating transactions across one or more databases. Below are examples that demonstrate how to use `DataSourceTransactionManager` in a Spring application.
Assuming you have a DataSource configured in your Spring application context, you can set up the `DataSourceTransactionManager` as follows:
1. XML Configuration:
<!-- Configure DataSource --><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver" /><property name="url" value="jdbc:mysql://localhost:3306/your_database" /><property name="username" value="your_username" /><property name="password" value="your_password" /></bean><!-- Configure Transaction Manager --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /></bean>
In this example, replace `com.mysql.cj.jdbc.Driver`, `jdbc:mysql://localhost:3306/your_database`, `your_username`, and `your_password` with your actual database driver, connection URL, username, and password.
2. Java Config (Annotation-based):
@Configuration@EnableTransactionManagementpublic class AppConfig {@Beanpublic DataSource dataSource() {DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");dataSource.setUrl("jdbc:mysql://localhost:3306/your_database");dataSource.setUsername("your_username");dataSource.setPassword("your_password");return dataSource;}@Beanpublic DataSourceTransactionManager transactionManager() {return new DataSourceTransactionManager(dataSource());}}
Again, replace the placeholder values with your actual database information.
Now, you can use the `@Transactional` annotation to manage transactions in your service or repository classes. Here's an example:
@Servicepublic class UserService {@Autowiredprivate JdbcTemplate jdbcTemplate; // Assuming you have JdbcTemplate configured@Transactionalpublic void updateUser(User user) {jdbcTemplate.update("UPDATE users SET name = ? WHERE id = ?", user.getName(), user.getId());}@Transactional(readOnly = true)public User getUserById(Long id) {return jdbcTemplate.queryForObject("SELECT * FROM users WHERE id = ?", new Object[]{id}, new UserRowMapper());}}
In this example, the `@Transactional` annotation is used at the method level. The `updateUser` method updates a user in the database, and the `getUserById` method reads a user from the database. The `readOnly` attribute is set to `true` for the `getUserById` method to optimize performance for read-only transactions.
Make sure to adapt these examples to your specific database setup and requirements.