spring 事务的例子
时间: 2023-11-09 13:56:20 浏览: 147
假设一个银行系统,其中有两个账户,分别是A和B。现在需要进行一笔转账操作,将A账户中的100元转到B账户中。
以下是使用Spring事务来处理这个转账操作的例子:
1. 创建一个AccountService类,用于封装转账操作。
```java
@Service
public class AccountService {
@Autowired
private AccountDao accountDao;
@Transactional
public void transfer(String fromAccount, String toAccount, double amount) {
Account from = accountDao.getAccount(fromAccount);
Account to = accountDao.getAccount(toAccount);
from.setBalance(from.getBalance() - amount);
to.setBalance(to.getBalance() + amount);
accountDao.updateAccount(from);
accountDao.updateAccount(to);
}
}
```
2. 创建一个AccountDao类,用于操作数据库中的账户信息。
```java
@Repository
public class AccountDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public Account getAccount(String accountNumber) {
return jdbcTemplate.queryForObject("SELECT * FROM accounts WHERE account_number=?", new Object[]{accountNumber}, new AccountRowMapper());
}
public void updateAccount(Account account) {
jdbcTemplate.update("UPDATE accounts SET balance=? WHERE account_number=?", account.getBalance(), account.getAccountNumber());
}
}
```
3. 创建一个Account类,用于表示账户信息。
```java
public class Account {
private String accountNumber;
private double balance;
public Account(String accountNumber, double balance) {
this.accountNumber = accountNumber;
this.balance = balance;
}
// getters and setters
}
```
4. 创建一个AccountRowMapper类,用于将数据库中的记录映射到Account对象中。
```java
public class AccountRowMapper implements RowMapper<Account> {
@Override
public Account mapRow(ResultSet rs, int rowNum) throws SQLException {
String accountNumber = rs.getString("account_number");
double balance = rs.getDouble("balance");
return new Account(accountNumber, balance);
}
}
```
5. 在Spring配置文件中开启事务管理。
```xml
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
```
6. 编写一个测试类,用于验证转账操作是否正确。
```java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class AccountServiceTest {
@Autowired
private AccountService accountService;
@Test
public void testTransfer() {
accountService.transfer("A", "B", 100);
Account accountA = accountService.getAccount("A");
Account accountB = accountService.getAccount("B");
Assert.assertEquals(0.0, accountA.getBalance(), 0.01);
Assert.assertEquals(100.0, accountB.getBalance(), 0.01);
}
}
```
在上述例子中,我们使用了@Transactional注解来标记转账操作,表示这个操作需要在一个事务中执行。如果转账操作中的任何一步失败,整个事务都将被回滚,保证数据的一致性。
阅读全文