gpt4 book ai didi

Java - 哪一种是用于预订系统的最佳锁定方法

转载 作者:行者123 更新时间:2023-12-02 05:49:53 25 4
gpt4 key购买 nike

假设我想为一个有 2 个大厅的多厅影院创建一个基于 Web 的预订系统,每个厅每天放映 4 场演出。我想同步每个演出的座位预订。

  • A 尝试预订 A 厅 2PM 演出
  • B 尝试预订 A 厅下午 6 点的演出
  • C 尝试预订 B 厅 2PM 演出
  • D 尝试预订 A 厅 2PM 演出
  • E 尝试预订 B 厅下午 6 点的演出

在所有这些中,我只希望 D 等待 A 完成预订,因为他们正在预订同一大厅和同一放映时间。所有其他人应该能够同时预订

我的业务层方法有hallName、showId作为参数

public int createBooking(String hallName, int showId){

//check if there are any available seats
//access DAO layer to create booking

return bookingId;
}

我无法同步此方法,因为这将使所有预订相互等待。

我无法使用信号量,因为它不基于参数获取/释放锁。我必须以某种方式在获取/释放锁时传递一个参数,或者根据演出 ID 创建一个预订队列。我不想对锁的数量进行硬编码,因为大厅和表演的数量可能会随着时间的推移而变化。

Java 6 有办法吗? (框架 - Spring 3/服务器 - Websphere7)

可能有一个简单的方法,但恐怕我没有朝着正确的方向思考。

最佳答案

您可能会看看事件溯源,了解他在现实生活中的情况。这是一种问题,是这种架构的一个典型例子。

我不会在这里解释完整的模型,为了简短起见,我什至会背叛它:

我将使用唯一 ID(可能是 UUID,或数据库提供)和时间戳创建 BookingRequested 事件,并将这些事件存储在数据库中(或内存队列中)。

然后查询处理器将对它们进行处理。它可以锁定内存中的对象,或者您甚至可能决定只有一个线程在一个房间上工作,提取该特定房间的未处理请求。如果不能,并且让远程系统处理相同的数据,解决方案可能是乐观锁定。

当对预订做出决定时,这是一个新事件,您也将存储在数据库中。它将包含原始请求的引用和结果。

Microsoft 有一本免费的 pdf 书“探索 CQRS 和事件溯源”,其中包含一个具有类似上下文的非常完整的示例(用于预订各种 session 席位的系统)。

关于Java - 哪一种是用于预订系统的最佳锁定方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23664644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com