【发布时间】:2021-08-17 12:58:41
【问题描述】:
我正在尝试通过 API 保存新预订。下面是保存预订功能的示例代码。
public function save_booking(Request $request){
$booking = new Booking;
$booking->booking_number = generate_booking_id();
$booking->booking_type = $request->input('bookingType');
$booking->booking_date = $request->input('bookingDate');
$booking->booking_time = $request->input('bookingTime');
$booking->booking_status = $request->input('bookingStatus');
$booking->save();
}
注意 - generate_booking_id() 是生成预订的辅助函数,例如 BN-202105-0001(最后四位数字 0001 是通过将总记录数加上预订表中的 1 来计算的)。
当两个或多个同时保存 API 请求尝试保存新预订时,会为这两个请求分配相同的预订编号。 (例如,请求 1 = BN-202105-0001,请求 2 = BN-202105-0001 等等。)
我想为每个同时发生的 API 请求分配不同的预订编号。 (例如,有 4 个同时请求尝试保存新预订,然后请求 1 = BN-202105-0001、请求 2 = BN-202105-0002、请求 3 = BN-202105-0003、请求 4 = BN-202105-0004)
如何在 Laravel 中解决这个并发请求问题?
提前致谢!
【问题讨论】:
-
为了确保我正确理解您的问题:您有自己的增量功能,但有时会生成重复的密钥,因此您最终会得到重复的预订号码?
-
@RobBiermann 实际上我的函数会生成正确的预订号,但是当 2 个请求同时保存记录时,会为这两个请求分配相同的预订号。
-
好的,那么这是一个经典的并发问题。我首先将数据库中的 booking_number 字段设置为唯一的,因此不可能存储重复项。然后,当您由于重复而无法保存时,您只需增加数字并重试
-
@RobBiermann 谢谢你的好建议。
-
我还添加了一些更详细的答案,这在我看来是最理想的。使用这种方法,您不需要进行错误处理,这可能会很痛苦
标签: php database laravel api concurrency