springboot 事务 案例
时间: 2023-08-08 12:10:48 浏览: 63
当然,我可以为您提供一个简单的 Spring Boot 事务案例。假设我们有一个银行应用,其中有两个服务:一个是转账服务(TransferService),另一个是账户服务(AccountService)。
首先,在您的项目中添加以下依赖项:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
```
接下来,创建一个账户实体类(Account)和一个转账记录实体类(Transaction),并使用 JPA 注解进行映射。
```java
@Entity
public class Account {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String accountNumber;
private BigDecimal balance;
// 省略构造函数、getter和setter方法
}
@Entity
public class Transaction {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String fromAccount;
private String toAccount;
private BigDecimal amount;
// 省略构造函数、getter和setter方法
}
```
然后,创建相应的仓库接口(AccountRepository 和 TransactionRepository)继承自 JpaRepository。
```java
public interface AccountRepository extends JpaRepository<Account, Long> {
Account findByAccountNumber(String accountNumber);
}
public interface TransactionRepository extends JpaRepository<Transaction, Long> {
}
```
接下来,实现转账服务(TransferService)。
```java
@Service
public class TransferService {
@Autowired
private AccountRepository accountRepository;
@Autowired
private TransactionRepository transactionRepository;
@Transactional
public void transfer(String fromAccountNumber, String toAccountNumber, BigDecimal amount) {
Account fromAccount = accountRepository.findByAccountNumber(fromAccountNumber);
Account toAccount = accountRepository.findByAccountNumber(toAccountNumber);
fromAccount.setBalance(fromAccount.getBalance().subtract(amount));
toAccount.setBalance(toAccount.getBalance().add(amount));
accountRepository.save(fromAccount);
accountRepository.save(toAccount);
Transaction transaction = new Transaction(fromAccountNumber, toAccountNumber, amount);
transactionRepository.save(transaction);
}
}
```
在上述代码中,我们使用了 @Transactional 注解来标记事务边界。当进行转账操作时,如果任何一个步骤出现异常,整个操作将会回滚。
最后,您可以创建一个简单的控制器(TransferController)来测试转账服务。
```java
@RestController
public class TransferController {
@Autowired
private TransferService transferService;
@PostMapping("/transfer")
public void transfer(@RequestParam String fromAccountNumber,
@RequestParam String toAccountNumber,
@RequestParam BigDecimal amount) {
transferService.transfer(fromAccountNumber, toAccountNumber, amount);
}
}
```
以上就是一个简单的 Spring Boot 事务案例。当您调用 `/transfer` 接口时,将会执行转账操作,并在必要时进行事务回滚。请注意,此示例使用了 PostgreSQL 数据库,您可以根据自己的需求进行更改。希望对您有所帮助!
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)