1. 预定业务流程(以电影院座位预定)

  1. 用户看到电影院预定UI,其中有空位和预订的座位。
  2. 用户选择座位并向服务器发送请求。
  3. 座位是为一个时间段保留,在此期间,用户必须支付(比如10min)。
  4. 如果用户不付款,座位状态将被设置为空置,否则它将被标记为预订。

2. 用悲观锁实现

我们假设有一张表记录【放映厅】--【座位】维度的数据,还有一些其他列字段如movie_session、userId、seat_status(booked or vacant)等;

case1:假设我选择一个座位,然后进入付款页面。此时,会话将获得一个锁,以便其他会话无法读取记录或对其进行更改。这种锁定被称为“独占锁定”。对于试图从表中访问锁定记录的任何其他用户的会话,必须等待表中特定记录的锁被释放。使用‘ FOR UPDATE’和 SELECT 查询来获取排他锁。

  • //A single transaction to book a tickets

    begin; // 事务开始

    seatsAvailable() -> Select * from booking where seat_number = ‘A1’ FOR UPDATE // 加排它锁&当前读

    bookTickets() -> update booking set customer_id = ‘101’ , seat_status = ‘booked’ where seat_number = ‘A1’; // 支付后更改 A1 row 数据状态

    commit; // 提交事务

注意:另一种类型的锁定是“共享锁”,其中一个会话可以在该行已被其他会话获取锁时读取该行。但是,在第一个会话释放锁之前,它不能进行更新。使用‘ FORSHARE’和 SELECT 查询来获取共享锁。共享锁并不适用我们的分析场景;

case2:多用户同时预订多个座位。一个用户选择A1至A4发起预定,与此同时,另一个用户选择的座位 A3至 A5发起预定。

  • //用户1 Transaction where user-1 books seats A1 to A4begin;seatsAvailable() -> Select * from booking where seat_number IN  (‘A1’,‘A2’, A3’, ‘A4’) FOR UPDATE  // 锁定数据行范围bookTickets() -> update booking set customer_id = ‘101’ , seat_status = ‘booked’ where seat_number IN  (‘A1’,‘A2’, A3’, ‘A4’) ; // 支付commit;
  • //用户2 A single transaction where user-2 tries to book seats A3 to A5begin;seatsAvailable() -> Select * from booking where seat_number IN  (‘A3’, A4’, ‘A5’) FOR UPDATE SKIP LOCKED; // 如果加SKIP LOCKED只会锁定A5行,否则获取锁失败返回bookTickets() -> update booking set customer_id = ‘102’ , seat_status = ‘booked’ where seat_number IN  (‘A3’, A4’, ‘A5’) // commit;

如果用户1优先获取了,A1-A4的行锁,在用户2则无法提交预定订单(因为A3,A4已经被加了排它锁),锁定失败,需要用户2重新选择其他座位;

3. 小结

  • 以上只是为了说明数据库来做的话如何实现的;
  • 现实场景中加锁用的最多的还是分布式锁,如redis实现锁,来支持业务的高性能和扩展性。
  • 当然也可以使用数据乐观锁,如版本号机制来完成加锁的能力

【mysql】只使用数据库DB如何实现--预定系统(古法)电影院座位预定相关推荐

  1. 前端小项目(一)| 电影院座位预定(html,css,js)

    前端小项目(一)| 电影院座位预定 前言 开始好好学习前端啦.学紫色爱心记录一波!! 初步学了html,css,js,在github上找了几个前端小项目模仿着练练手.第一个就是电影院座位预定页面,主要 ...

  2. 模仿电影院座位预定效果

    效果 Html代码: <html> <head> <title>座位预定</title><link href="style.css&qu ...

  3. dmb: 数据库监控及灾备系统(for mysql)_【数据库】MySQL企业级数据库灾备(备份)系统-DMB v2.1发布...

    为了这系统宅了很多个周末,又一个小长假过去了, DMB v2.1终于可以那得出手了,现在分享出来让朋友们使用,希望能得到更多更好的建议.DMB 对InnoDB存储引擎支持在线热备(ibbackup, ...

  4. 会议室预定系统的设计与实现(论文+源码)_kaic

    摘    要 会议室预定系统的设计与实现 随着科学技术的飞速发展和革新, 人民生活中的各项活动似乎都离不开计算机和网 络技术, "万能"的计算机几乎能够自动完成所有的工作.为了提高 ...

  5. 基于JAVA机票预定系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署

    基于JAVA机票预定系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署 基于JAVA机票预定系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署 本源码技术栈: 项目架构:B/S ...

  6. discuz mysql查询_Discuz!X/数据库 DB:: 函数操作方法

    本篇对数据库操作函数db进行讲解.DB::table($tablename)获取正确带前缀的表名,转换数据库句柄, DB::delete($tablename, 条件,条数限制)删除表中的数据 DB: ...

  7. java毕业设计体育城场地预定系统前台源码+lw文档+mybatis+系统+mysql数据库+调试

    java毕业设计体育城场地预定系统前台源码+lw文档+mybatis+系统+mysql数据库+调试 java毕业设计体育城场地预定系统前台源码+lw文档+mybatis+系统+mysql数据库+调试 ...

  8. JAVA计算机毕业设计体育城场地预定系统后台源码+系统+mysql数据库+lw文档

    JAVA计算机毕业设计体育城场地预定系统后台源码+系统+mysql数据库+lw文档 JAVA计算机毕业设计体育城场地预定系统后台源码+系统+mysql数据库+lw文档 本源码技术栈: 项目架构:B/S ...

  9. java计算机毕业设计在线民宿预定系统源码+系统+mysql数据库+lw文档

    java计算机毕业设计在线民宿预定系统源码+系统+mysql数据库+lw文档 java计算机毕业设计在线民宿预定系统源码+系统+mysql数据库+lw文档 本源码技术栈: 项目架构:B/S架构 开发语 ...

最新文章

  1. 在Python中调用C++,使用SWIG
  2. java 链接mysql 产生500W数据模拟生成环境
  3. 酒桌上,领导将酒泼到你脸上......
  4. 火狐firefox插件配合scrapy,注意tbody会导致empty
  5. [原创]java WEB学习笔记58:Struts2学习之路---Result 详解 type属性,通配符映射
  6. linux第五周微职位
  7. android ImageSwitcher案例
  8. php 微信公众 验证失败,微信公众平台token验证失败
  9. 用VB实现自己的邮件“自己发”
  10. 利用计算机教学的体会,教师计算机教学学习体会
  11. Java程序员职业规划
  12. U盘被写保护不能重新格式化
  13. Windows的AppData 文件夹
  14. c++17好用的新特性总结
  15. safari浏览网页时显示“不安全网站”怎么办?
  16. (Emitted value instead of an instance of Error) postcss-viewport-units:
  17. 手机号已经绑定微信号,现在怎么再注册一个微信号
  18. vscode配置c语言并优化
  19. 资产管理之RFID资产管理系统解决方案-RFID资产智能盘点-新导智能
  20. mysql在test库中创建表stu_数据库mysql练习

热门文章

  1. 云呐|RFID资产管理,rfid资产管理系统优势
  2. 国家公务员面试主要采取的是结构化的面试形式
  3. 26 工作流会签开发一票通过,一票否决,多数同意通过
  4. [深入理解SSD 为SSD编程] 访问模式和系统优化
  5. 计算机玩游戏ip,想和朋友联机玩游戏找不到IP地址怎么办?如何查询电脑ip地址?...
  6. matlab找不到bma_g代码,基于矢量图形的G代码自动生成软件路径优化算法的研究
  7. 【CSS】盒子模型、内边距、背景设置_03
  8. Say Hello 一下
  9. The Wiley Handbook of Human Computer Interaction翻译
  10. python迭代器什么时候用_python迭代器与生成器用途是什么