首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用Springboot的电影票务应用程序中锁定用户座位

如何在使用Springboot的电影票务应用程序中锁定用户座位
EN

Stack Overflow用户
提问于 2022-09-02 18:35:29
回答 2查看 221关注 0票数 0

我试图建立一个电影票务预订应用程序,只是为了实践面试低水平的设计视角。

一个剧院可以有多个屏幕和每个屏幕作为一些座位的容量。放映是一部将在银幕上放映的电影。

下面是我创建的模型/实体类。

代码语言:javascript
复制
public class Booking {

    private final String id;
    private final Show show;
    private final List<Seat> seatsBooked;
    private final String user;
    private BookingStatus bookingStatus;
}

public enum BookingStatus {
    Created,
    Confirmed,
    Expired
}

public class Movie {

    private final String id;
    private final String name;

    //Other metadata
}

public class Screen {

    private final String id;
    private final String name;
    private final Theatre theatre;
    //Other screen metadata.

    private final List<Seat> seats;
}

public class Seat {

    private final String id;
    private final int rowNo;
    private final int seatNo;
}

public class Show {

    private final String id;
    private final Movie movie;
    private final Screen screen;
    private final Date startTime;
    private final Integer durationInSeconds;
}

public class Theatre {

    private final String id;
    private final String name;
    private final List<Screen> screens;
    //Other theatre metadata.
}

参考链接获取完整代码和参考- 电影票预订应用程序

我还没有在类中包含getter、setter和一些方法。在这里,当用户在应用程序中搜索电影名称时,它将由ShowController.java处理,并将显示在影院中的一些电影放映给用户。然后,如果用户为一个特定的影院屏幕选择一个节目。然后用户会根据自己的选择选择一些座位。现在问题来了,当一个用户选择一个座位列表时,我想将这些座位状态更改为CREATED (enum BookingStatus),而那些所选的座位必须是其他用户不可用的。因此,我如何标记这些座位被其他用户占用或不可用,因为它是一个多线程应用程序。此外,如果用户支付失败或注销,我如何才能解锁这些座位,以便他们可以为其他用户。

请提供一些代码或任何有用的链接,如何做到这一点?这是一种很好的方法来保存座位的状态,当更改为在内存存储中创建的像Redis,对于用户选择的座位,我们检查每个座位的状态在Redis中是否是保留的。如果用户成功预订,那么我们可以在数据库中将这些座位标记为永久保留。

EN

回答 2

Stack Overflow用户

发布于 2022-09-03 00:45:14

这并不是一个真正的答案,因为我不是一个数据库的人,但这里有一个粗略的草图,我将尝试:

  1. 应用程序锁定可用座位表,获取表的快照,解锁,然后将快照显示给用户。
  2. 用户做他们的选择,并按下一个按钮,标签为“预订座位”。
  3. 应用程序锁定表并检查选定的座位是否仍然可用。有两种可能的结果: 答:如果一个或多个座位被其他更快的用户保留了,应用程序就会解锁表格,显示一个对话框,上面写着“对不起,其他人弄坏了,请再试一次”,然后回到第一步。 否则,应用程序将这些座位标记为on_hold,它会对它们进行时间戳,并将表解锁。on_hold阻止其他用户预订相同的座位,但只能保留一段有限的时间--也许只有5分钟。这些座位还与“购物车”有关。
  4. 现在,用户在购物车中保留了一定数量的座位,但还没有支付费用。用户可以选择返回并预订更多的座位,但假设他们按了"Checkout“按钮。
  5. 申请表提供给用户填写信用卡信息等表格,但同时,其他用户也在寻找座位。如果,在其他用户的步骤1(还记得步骤1?)任何座位出现在on_hold超过5分钟,应用程序将; 将座位状态更改为available,以及 取消那个座位的购物车。(购物车的主人看到一个对话框,上面写着“哦!太糟了!太可悲了!你等得太久了”,他们被送回第一步。)
  6. 但是,如果用户在购物车被取消之前完成了事务,那么应用程序将锁定座位表,将座位状态更改为sold,解锁座位表,并发送给用户他们的票。
票数 1
EN

Stack Overflow用户

发布于 2022-09-03 00:56:08

粗略而仓促的大脑转储:同意Uldall的观点,首先创建数据模型和SQL,然后规范化并验证它。您需要一个客户实体/表。我认为您需要一个显示和座位之间的关联实体,就像ShowSeat提供了对显示、座位和客户的引用。ShowSeat还具有isConfirmed布尔标志和lockExpirationTimestamp。show_seat表上的主键是show_id和seat_id的组合(需要@Embeddable类来表示)。当客户选择节目的座位时,将行插入到show_seat中,但在确认前不要设置确认=‘Y’。show_seat表中包含lock_expiration_timestamp < now()并确认为‘N’的任何行都是公平的,可以交给另一个客户。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73586759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档