首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >订单系统中并发问题和锁机制的探讨

订单系统中并发问题和锁机制的探讨

作者头像
用户1257393
发布于 2018-03-21 09:23:25
发布于 2018-03-21 09:23:25
1.5K0
举报
文章被收录于专栏:精讲JAVA精讲JAVA

问题由来

假设在一个订单系统中(以火车票订单系统为例),用户A,用户B都要预定从成都到北京的火车票,A、B在不同的售票窗口均同时查询到了某车厢卧铺中、下铺位有空位。用户A正在犹豫订中铺还是下铺,这时用户B果断订购了下铺。当用户A决定订下铺时,系统提示下铺已经被预订,请重新选择铺位。在这个系统场景中,我们来探讨一下,火车票系统是怎样处理并发事件以及怎么利用锁机制来避免重复订票的。

设想的方案

方案1:

为了避免重复订票,大部分人会想到在做订票操作前,去数据库查询该铺位是否已经被预订,假设“铺位”数据库表增加标记字段FLAG(空闲:0;已预订:1),如果查询到铺位的FLAG字段值为1,那么预订就不成功,如果为0就成功预订,并把FLAG置为1。这种方案如果在业务量很少的系统中,或许可行。但业务量较大时,特别是火车票这样的业务量,就会出现问题。问题在,当用户A、用户B同时对同一铺位预订时,虽说是“同时”,但对于数据库操作来说一定是有先后顺序的,假设A在查询该铺位的FLAG时,值为0,准备预订并将值设为1,而与此同时B已经预订成功,并已将FLAG设为1。而A因为没有即时查询到FLAG=1,因此也预订成功,又将FLAG设为1。

A FLAG=0 时刻=T1 (查询)

B FLAG=0 时刻=T2 (查询)

B FLAG=1 时刻=T3 (更新)

A FLAG=1 时刻=T4 (更新)

这样就造成了重复订票,在购票高峰期,使用这样的方案,重复订票不可避免。

方案2:

我们想到了利用数据库的悲观锁来解决这个问题,设想假如用户A查询到想预订的票,用户B根本都查询不到,只有A一个人能看到,那是不是没有重复订票的可能了,因为压根没人跟他抢。可以这样实现这个方案:

select * from table where …… for update skip locked,该语句是查询用户指定条件的票信息,并加锁(for update),如果有记录已经被锁则自动跳到下一条记录(skip locked),这样谁先查询谁就可以慢慢的考虑要上铺还是下铺。但火车票系统是这样做的吗?显然不是,因为这样用户体验太不好,票实际还很多,但确看不到买不到,这显然不合理。

方案3:

我们又想到了从程序层面来解决并发问题,最简便的方式是利用synchronized来处理,但我们要知道一个大型系统必然是集群方式部署的,synchronized只能解决单节点环境的并发问题,要解决此问题还是必须依赖全局性的锁机制。

方案4:

既然又回到了在数据库上加锁,我们又想一下如果我们在查询时,使用乐观锁,但在预订之前使用悲观锁会怎样呢?例如我们查询时:

select * from table where ……

用户A、用户B都查询到了相同的票信息(中铺和下铺),用户A或用户B在预订时做一次悲观锁:

select * from table where …… for update(只对预订的票做悲观锁)

此时后者在预订时,无法获取该记录的锁,自然就无法预订,避免了重复预订的问题。

还有方案吗……

出处:http://www.cnblogs.com/leefreeman/p/3711470.html

版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-02-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 精讲JAVA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
主流AI代码工具对比
在当今数字化时代,软件开发的复杂性和工作量不断增加,AI代码助手应运而生,为开发者提供强大的辅助工具,以提高编程效率、降低开发成本并提升代码质量。众多AI代码助手产品各具特色,本文将对CodeBuddy、通义灵码、Trae、GitHub Copilot、Codeium和Cursor这六款产品进行深入对比分析,以帮助开发者更好地了解各产品的优势与特点,从而选择最适合自己的工具。
爱吃鱼的企鹅
2025/06/27
4530
AI 原生时代新质软件研发
今年 1024 程序员节,AI for SE 成为热点话题。随着生成式 AI 在软件工程领域的深度应用,开发者的编程习惯和开发方式发生转变,开发工具也在加速更新换代。
CloudStudio
2025/02/12
1720
AI 原生时代新质软件研发
AI编程革命:效率飙升的背后,程序员离“告别996”还有多远?
近期的行业动态呈现出一幅矛盾图景:微软一边宣布季度营收620亿美元创新高,一边裁撤6000个技术岗位,其中32%来自AI相关部门。与此同时,GitHub年度报告揭示AI已接管65%的基础编码工作,被裁工程师需3小时完成的模块,Copilot仅需15分钟就能生成更优方案。而腾讯研究院最新报告显示,47%的程序员已在日常工作中使用AI编码工具,渗透率仅次于写作辅助工具。
熊猫钓鱼
2025/08/01
910
AI编程革命:效率飙升的背后,程序员离“告别996”还有多远?
AI 代码助手对编程效率提升的比较分析
在当今数字化快速发展的时代,编程效率的提升对于软件开发至关重要。AI 代码助手应运而生,为开发者带来了诸多便利。市面上有多种 AI 代码助手产品,其中 CodeBuddy 凭借自身优势,在某些方面表现较为突出,以下是对这些 AI 代码助手产品的客观介绍和对比:
用户11288883
2025/06/30
920
耗时6个月,我做了一款干净、免费、开源的AI数据库
他是数据库也集成了AIGC的能力,能够将自然语言转换为SQL,也可以将SQL转换为自然语言,还可以给出SQL的优化建议,可以极大提升效率。
敖丙
2023/09/08
1.4K0
耗时6个月,我做了一款干净、免费、开源的AI数据库
我在腾讯用AI写代码
本文采访了13位来自不同产品团队的一线开发者,他们都在用腾讯云 AI 代码助手写代码,使用时间超过1年,在此他们与我们分享使用腾讯云 AI 代码助手的真实感受。
腾讯云代码助手 CodeBuddy
2025/01/14
3380
氛围式编程什么鬼!?
Vibe Coding(氛围式编程)是一种革命性的软件开发方法,由AI专家Andrej Karpathy在2025年初提出并推广。这种方法让开发者利用大型语言模型(LLMs)通过自然语言描述来生成代码,从而改变了程序员的角色——从手动编写代码转变为引导和优化AI生成的解决方案。
腾讯云开发者
2025/04/23
5860
氛围式编程什么鬼!?
GitHub重磅编程助手Copilot X上手体验
作者:nicky 最近科技圈是真热闹,各大公司相继发布了自家的人工智能新产品,ChatGPT、GPT4、文心一言、Bard。微软更是接二连三地宣布将 GPT-4 应用到 Bing 搜索引擎、Edge 浏览器、Office 全家桶中。3 月 22 日其旗下代码托管平台 GitHub 再次发布重磅“炸弹”:GitHub Copilot X。 Copilot X 是对 2021 年发布的 Copilot 进行了升级,接入 GPT-4,并新增了聊天和语音等功能,在 Copilot X 中,你只需“动动嘴”,它就能把
腾讯技术工程官方号
2023/04/01
3.2K0
GitHub重磅编程助手Copilot X上手体验
中国版Cursor | 我用CodeBuddy Craft 3分钟复刻NFC经典游戏
做为一个懒人程序员,从AI迅速发展开始就一直在寻找能够替代码农编码的AI工具。从最早的GitHub Copilot,到CodeGeeX,再到Bito。紧接着后面的Cursor,Trae等等。技术生态发展之迅猛,让牛马们直呼学不完。
有一只柴犬
2025/05/13
4021
中国版Cursor | 我用CodeBuddy Craft 3分钟复刻NFC经典游戏
详解|LLM对程序员的冲击和影响
LLM对软件研发的单点提效,我之前录制过一段视频,大家可以直接观看,里面有详细的演示,我在这里就不再赘述了。
腾讯大讲堂
2023/08/05
8600
详解|LLM对程序员的冲击和影响
程序员不能不知道的13个AI开发工具
随着人工智能的进步,开发行业已经发展到了新的水平。 目前,人工智能工具在开发者中很受欢迎,因为它正在迅速重塑开发行业。
从大数据到人工智能
2023/10/18
5.7K0
程序员不能不知道的13个AI开发工具
AI copilot 能提升开发效率么?
作为 Github copilot 刚 beta 发布就重度使用至今的有二十多年码龄四十多岁还在写代码的码农,我觉得我有足够的说服力来阐述我对这个问题的理解。当然,口说无凭,本着「谁主张谁举证」的民事诉讼原则,我拿 github 自身的 copilot statistics API 看了一下我过去近三周的使用数据(我不是每天都写代码,所以有些天没数据),惊奇地发现我使用 copilot 比我想象得还要「勤劳」:
tyrchen
2024/06/04
3010
AI copilot 能提升开发效率么?
GPT-4 Copilot X震撼来袭!AI写代码效率10倍提升,码农遭降维打击
---- 新智元报道   编辑:编辑部 【新智元导读】GPT-4加强版Copilot来了!刚刚,GitHub发布了新一代代码生成工具GitHub Copilot X,动嘴写代码不再是梦。 微软真的杀疯了! 上周,微软刚用GPT-4升级了Office办公全家桶,还没等人们反应过来,微软又来抄码农的家了。 今天,GitHub官宣:基于GPT-4的新一代代码生成工具Copilot X来了! GitHub Copilot发布还不到两年,就已经为100多万的开发者编写了46%的代码,并提高了55%的编码速度。
新智元
2023/03/29
1.3K0
GPT-4 Copilot X震撼来袭!AI写代码效率10倍提升,码农遭降维打击
谷歌公开自家「AI+软件工程」框架DIDACT:数千名开发者内部测试,用了都说生产力高
任何一个大型软件都不是一开始就构思完善的,而是通过开发人员的一次次改进、编辑、单元测试、修复构建错误、解决代码审查,再循环解决问题,直到满足上线需求后才能把代码合并到仓库中。
新智元
2023/08/05
5900
谷歌公开自家「AI+软件工程」框架DIDACT:数千名开发者内部测试,用了都说生产力高
智能数据库客户端工具真香!
今年最火的 IT 技术当属 AIGC,AI 已经应用到各种场景,最近在逛github时候发现了一个智能且多功能的多数据库客户端工具--Chat2DB,目前在GitHub上标星8k+。
永恒君
2023/09/02
6820
智能数据库客户端工具真香!
仅20%的程序员掌握!GitHub Copilot 进阶技巧,同样的工具,不同样的效率!
近来,在编程领域比较火热的AI工具,最为实用和高效的,应该就是GitHub Copilot和AI Assistant。
程序视点
2024/04/12
1.8K0
仅20%的程序员掌握!GitHub Copilot 进阶技巧,同样的工具,不同样的效率!
AI会取代程序员吗?
从去年用上WCA(Watsonx Code Assistant)起,到Copilot、Deepseek及智能终端工具Warp,使用AI编程助手快一年左右的时间了。亲眼见证了AI一步一步变强大的过程。作为一个从业十多年的老家伙,今天跟大家分享一下我对AI工具的一些看法。
宅蓝三木
2025/08/12
1240
AI编程工具深度对比
腾讯云代码助手 CodeBuddy在智能代码补全、Craft智能体、代码评审与优化、单元测试生成、技术问答与知识库、工程级自动化、MCP协议生态以及零成本企业级功能等方面都具有明显的优势,其功能较为全面且强大,能够为开发者提供一站式的AI编程辅助体验。相比之下,通义灵码在智能代码补全和工程级自动化方面有一定的表现,但在其他功能上相对欠缺。而Trae、GitHub Copilot、Codeium和Cursor在这些功能上的支持则相对较少,功能较为单一。
爱吃鱼的企鹅
2025/06/26
2080
99%的程序员都会失业吗?丨AI原生研究系列之AI Coding
又到一年高考季,因为这几年一直在研究大模型,有好几个家长朋友都来咨询,要不要给自己孩子报考计算机专业?接到这个问题,面对“周更”、甚至“日更”的大模型浪潮,着实难给出一个准确的回答,只能说:编程作为一种抽象和拆解问题的方法论依旧重要,但写代码这件事正被重新定义——自然语言正快速变成新的最高级的编程语言。
小腾资讯君
2025/07/16
2230
让AI替你打工?GPT提升开发效率指南
开发者日常的整个工作流中,AI 大模型能做什么?ChatGPT 等 AI 大模型能不能通过开发者的指引,一步步完成从技术方案输出、编码、测试、发布到运营维护的整套流程?使用中有什么避坑点?本文从实际研发流程的各个环节出发,总结分享了 AI 大模型对研发效能的提升实践。欢迎围观~
腾讯云开发者
2023/05/23
1.2K0
推荐阅读
相关推荐
主流AI代码工具对比
更多 >
交个朋友
加入[数据] 腾讯云技术交流站
获取数据实战干货 共享技术经验心得
加入数据技术趋势交流群
大数据技术前瞻 数据驱动业务实践
加入[数据库] 腾讯云官方技术交流站
数据库问题秒解答 分享实践经验
换一批
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档