繁体   English   中英

如何在预订网站中处理休眠交易

[英]How to handle the hibernate transaction in a booking site

我是新来的冬眠。 请帮助我设计以下方案。

在预订站点中,用户可以单独预订机票,也可以预订机票和酒店。 我如何在休眠状态下设计事务管理,以便在以下情况下能够完全满足需要。

订了机票和酒店的用户,

1:航班预订已成功,但由于某些系统问题,无法预订酒店。 在这种情况下,将成功提交航班预订数据库,但酒店数据库应回滚。

2:两个预订均成功完成。 两者都提交表。

3:如果航班预订失败,则两次预订都将失败。 两个表都应提交。

谢谢

假设您将在下面使用spring和hibernate是问题的高级设计:

  1. 创建2个实体,一个映射到“航班预订”表,另一个映射到“酒店预订”表。

  2. 创建2个DAO(spring @Repository),一个DAO负责对Flight Booking的任何更改,另一个负责对Hotel Booking表的更改。

  3. 在Flight Booking DAO / Repository中创建一个名为bookFlight的方法,并处理所有异常,并将其包装在一个经过FlightBookingException检查的自定义异常中,然后将其重新扔给调用方。 在这种方法中,您可以考虑使用上面的航班休眠实体来保留航班详细信息。

  4. 在酒店预订DAO /存储库中创建一个名为bookHotel的方法,并处理所有异常,然后将其包装在自定义的HotelBookingException中,并使用适当的消息将其重新抛出。 同样,在此方法中,您可以考虑使用上述酒店休眠实体来保留酒店详细信息。

  5. 创建一个服务层(Spring @Service),将这2个DAO自动连接到该服务层,并创建一个名为bookflightandhotel方法的方法,该方法以@Transactional进行注释,并在此bookflightandhotel方法中调用这2个DAO方法(先是航班,然后是hotel)。

现在默认情况下,当引发检查异常时,spring不会回滚事务,这就是为什么您需要使用@Transactional批注的回滚功能仅标记FlightBookingException的原因。 (例如:-@Transactional(rollbackFor = FlightBookingException.class))。 这样做是为了达到上述问题中的第1点和第3点。

现在,在spring配置文件中,您需要配置JTATransactionManager(请参阅docs Spring Transaction

最后,您可以编写一个Spring Junit来测试该功能。 如果您还有其他疑问,请告诉我们。

检查两阶段提交。 您可能想围绕这些想法发展一些东西。

一种方法可能是您转到机票预订系统并锁定资源。 然后,您进入酒店预订系统并尝试进行预订。 如果预订成功,则您可以预订航班。 当您锁定资源时,您应该能够做到这一点。 但是,在某些极端情况下您需要注意。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM