我有一个/cancel_reservation
端点,该端点带有一个ReservationId并需要认证。在这种方法内,预订被取消并退款。现在,如果同一用户同时调用此方法两次,则可能会发生争用情况,并且可以退款两次。
目前,我通过使static Set
包含锁定的保留ID来解决了此问题,该方法首先检查了保留ID是否未锁定。但是我认为有更好的方法来解决这个问题?
编辑:保留保存在Couchbase上,但我不希望使用db乐观/悲观锁定来使db独立。同样,我怀疑乐观锁定是否会在这种情况下有所帮助。
也该方法的流程如下:
获取预订⮞定期检查with通过第三方服务取消预订⮞退款给用户⮞更新预订状态+其他数据⮞坚持预订
尽管让您的应用程序保持“与数据库无关”是一件好事,但在这种情况下,我个人还是会退回到CB乐观/悲观锁定中。如果您真的想在应用程序端解决它,则同步块可能是一个简单的解决方法*:
publis Result cancelReservation(String refundId) {
synchronized (refundId) {
//do something
}
}
*我假设您没有使用反应性弹簧储存库。