利用数据库唯一约束解决线程安全的一个问题
来源:互联网 发布:tp link软件升级 编辑:程序博客网 时间:2024/04/29 18:38
情况是这样的
用户在我们商城上买商品并付完款后会有一个 orderId 号,拿着这个号和用户的token(当然是我们程序员处理的) 去请求一个连接可以得到优惠券
我在后台还需要保存派送记录表,由于orderid 是唯一的,而且每个orderId 只能获得一张优惠券,由于前端可能被多次调用(前端有bug),那就会导致多次用
同一个orderId 进行派送优惠券,所以需要解决这个问题
我第一次的做法是这样的
每次去获得优惠券的时候先到数据库的 派送记录表查询 这个 orderId 是否已经进行过派送,如果已经派送那就返回提示给用户已经领取过优惠券了
刚开始没考虑那么多,以为这样就行了,后来看了一下日志,发现了问题,生产环境上有6台机,每次都是先查询数据库,如果用户以某一个orderid
进行了大量的并发,那么很有可能在还没插入数据时不断的调用了派卷接口,因为派卷接口是第三方的,耗时比较长,在还没插入数据的时候又有请求
进来就导致了会发送多个派卷请求去派卷,出现了线程安全的问题,,,遇到这个问题后我第一反应就是利用 synchronized 关键字来处理这个问题,
但是这样会导致并发降低,效率低下,故没有采取,经过了一定时间的考虑,我想到了用数据库的 唯一约束可以解决这个问题
具体的做法如下
首先为 派送记录表的 orderId 字段 添加一个唯一约束条件,然后程序里面改为一进来就插入数据,插完数据再进行派卷,这样一来出现 违反约束条件异常
的时候就直接提示用户已经领取过优惠券, 派送优惠券的代码也就不用执行,这样就避免了同一个 orderId 进行多次派送优惠券
阅读全文
0 0
- 利用数据库唯一约束解决线程安全的一个问题
- Oracle数据库的唯一约束
- Oracle数据库报违反唯一约束的问题
- 解决android开发中无法trycatch到由唯一性约束导致的数据库insert不进数据erro的问题
- 数据库唯一性约束
- 随手记录——MySQL数据库设置唯一性约束遇到的问题
- 利用线程的同步和互斥解决两个消费者两个生产者一个临界区问题
- 数据库的安全和完整性约束
- Oracle 数据库唯一约束中的NULL的处理
- Oracle 数据库唯一约束中的NULL的处理
- oracle数据库 唯一约束的创建与删除
- oracle数据库 唯一约束的创建与删除
- servlet 是否线程安全,是否单例模式,怎么解决线程安全的问题
- 完美解决强类型dataset的移植问题!!未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值。
- 线程安全 问题 如何判断一个类是否是线程安全的
- 关于mysql删除唯一约束的问题(求解答)
- tb_0030出现违反唯一性约束的问题
- 利用SynchronizationContext解决界面要素的线程同步问题
- 递归 求全排列与全组合
- Python-Selenium学习笔记一
- 行人属性“Fully-adaptive Feature Sharing in Multi-Task Networks with Applications in Person Attribute Cl”
- H265
- GitHub 年度报告,2017 年最受欢迎的编程语言
- 利用数据库唯一约束解决线程安全的一个问题
- hbase实战之常用操作工具类
- 我的前端进阶之路(面试题)
- Spring MVC请求转发与拦截
- 马化腾:这个市场不是拼钱、拼流量,而是拼团队、拼使命感和危机感
- chrome浏览器打印高度少0.2mm的问题
- 腾讯云 服务器上安装svn
- 阿里云centos配置vsftpd解决530 Login incorrect问题
- 景行盒子是什么?有什么用?