垦利县企业型网站建设,济南专业做网站公司哪家好,网站线框图怎样做,北京 工业网站建设公司酒店预定系统本身设计过程中会遇到售卖系统两个常见问题#xff0c;第一个同一个房间同一日期被多个订单预定#xff0c;或者预定和库存数据不一致#xff0c;这些都会涉及到金钱#xff0c;需要在系统涉及是被重点考虑。
问题1:同一个房间同一个日期被多个订单预定
酒店…酒店预定系统本身设计过程中会遇到售卖系统两个常见问题第一个同一个房间同一日期被多个订单预定或者预定和库存数据不一致这些都会涉及到金钱需要在系统涉及是被重点考虑。
问题1:同一个房间同一个日期被多个订单预定
酒店商家考虑有顾客会取消订单可以超卖10%的商品但是需要保证同一个房间不能被预定多次。有两种场景可以导致同一个房间被预定多余多次第一种是用户同一订单点击了多次另外一种是多个用户同时预定了同一个房间。
对于第一种场景解决办法当用户进入到下单详情页面是服务端客户端产生不可靠产生一个唯一id作为幂等键跟随详情页信息返回。
对于第二种场景解决办法
第一种是使用被关锁在准备下单减库存时使用select …for update 将这个库存表先锁起来优点实现起来简单确定当需要锁定资源过多是需要考虑各种资源的锁定顺序和关系容易引起死锁。
第二种是使用乐观锁在数据库里面增加一个version字段当更新数据时对于要更新记录加1只有准备写入版本大于数据库版本才更新成功否则重新从数据库获取重复更新存在一个自旋的过程当竞争很激烈时整个服务性能会变差。
第三种使用数据库底层限制CONSTRAINT check_room_count CHECK((total_inventory - total_reserved 0))优点实现简单缺点不是所有数据库都支持并且当用户页面看到有库存但可能下单不成功引起用户不好体验竞争激励时性能也会变差整体来说不好的一面和乐观锁相似。
问题2:房间库存和订单数量不一致
在微服务设计中有些公司库存和订单数据不在同一个数据库如何保证库存和订单数量一致性将变成一个需靠考虑的问题
第一种办法是使用分布式事务两阶段提交2PC可以保证强一致性但是性能不好真实中采取的很少。
第二种是采用最终一致性下单的之前先锁库存给库存设定一个锁定时间过期自动释放锁定然后再下单如果下单失败或者没有没有支付释放库存。 第三种直接把库存和订单设计到同一个数据库里面使用数据库的事物保证强一致性。
补充知识点
两阶段提交Two-Phase Commit 2PC是分布式事务执行的一个过程分布式事务执行分为三步骤一个阶段协调者向所有参与者发送事物内容询问是否可以提交事物等所有参与者回复所有参与者回复可以才可以进入到第二阶段。第二阶段是协调者通知所有参与者执行分布式事务一些事准备将undo和redo日志写入到事物日志中只有所有参与者回复执行成功才会进入到第三阶段否则撤销执行第三阶段是协调者通知所有参与者提交事物一个分布式事务才会执行成功通常将前两个步骤成为第一个阶段成为确认阶段。