[英]How to handle the hibernate transaction in a booking site
我是新来的冬眠。 请帮助我设计以下方案。
在预订站点中,用户可以单独预订机票,也可以预订机票和酒店。 我如何在休眠状态下设计事务管理,以便在以下情况下能够完全满足需要。
订了机票和酒店的用户,
1:航班预订已成功,但由于某些系统问题,无法预订酒店。 在这种情况下,将成功提交航班预订数据库,但酒店数据库应回滚。
2:两个预订均成功完成。 两者都提交表。
3:如果航班预订失败,则两次预订都将失败。 两个表都应提交。
谢谢
假设您将在下面使用spring和hibernate是问题的高级设计:
创建2个实体,一个映射到“航班预订”表,另一个映射到“酒店预订”表。
创建2个DAO(spring @Repository),一个DAO负责对Flight Booking的任何更改,另一个负责对Hotel Booking表的更改。
在Flight Booking DAO / Repository中创建一个名为bookFlight的方法,并处理所有异常,并将其包装在一个经过FlightBookingException检查的自定义异常中,然后将其重新扔给调用方。 在这种方法中,您可以考虑使用上面的航班休眠实体来保留航班详细信息。
在酒店预订DAO /存储库中创建一个名为bookHotel的方法,并处理所有异常,然后将其包装在自定义的HotelBookingException中,并使用适当的消息将其重新抛出。 同样,在此方法中,您可以考虑使用上述酒店休眠实体来保留酒店详细信息。
创建一个服务层(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.