springboot中,有一个接口,进行模拟用户提现的操作,用户账户数据从表里获取,数据校验完后进行账户余额的扣除等,但是由于用户使用h5,以及pc等设备同时请求接口,导致出现一下情况: 第一个请求:A账户100,提现前100,本次提现50,账户余额50. 第二个请求:A账户100,提现前100,本次提现50,账户余额50. 且两次都成功,就导致用户第二次的提现金额不以第一次的总金额-第一次的提现金额来计算,但是接口上添加了事务注解:@Transactional(rollbackFor = Throwable.class),还是出现了这个问题,如何使用synchronized或者ReentrantLock实现以上问题
时间: 2024-04-11 12:27:51 浏览: 101
在Spring Boot中使用synchronized或者ReentrantLock来处理并发情况是一种常见的解决方案。你可以在提现接口方法中添加同步锁,确保同一时间只能有一个请求能够执行该方法。下面是一个示例:
```java
@RestController
public class WithdrawController {
private final ReentrantLock lock = new ReentrantLock();
@PostMapping("/withdraw")
public Result withdraw(@RequestBody WithdrawRequest request) {
lock.lock(); // 获取锁
try {
// 具体的提现逻辑
// ...
return Result.success();
} finally {
lock.unlock(); // 释放锁
}
}
}
```
在上面的示例中,使用了`ReentrantLock`来创建一个可重入锁,并在提现接口的方法中获取和释放该锁。这样一来,同一时间只有一个请求能够获取到锁,其他请求需要等待。
这种方式可以确保在同一时间只有一个请求能够执行提现逻辑,避免了并发问题。同时,事务注解`@Transactional`也能够保证数据库操作的原子性。
需要注意的是,使用锁会对系统性能产生一定的影响,因为其他请求需要等待锁的释放。因此,在使用锁解决并发问题时,需要权衡性能和数据一致性之间的关系,合理地选择合适的方案。
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.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)
![](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://img-home.csdnimg.cn/images/20241231044833.png)
![-](https://img-home.csdnimg.cn/images/20241231044930.png)