5分 |
需求:
一个手机号同一时间只能下一次订单, 关键点是手机号不能作为唯一键(业务需要); 这两个需求有矛盾或者有表达歧义。 解决方案: |
5分 |
|
交易完成不能清除记录,唯一能做到的是把失败的记录在状态回写时转移数据。 |
|
5分 |
临时表里面,对于完整的交易,当然要进行删除操作了,但,这不妨碍你在删除前,先把数据迁移的别的表里面呀。
用户对数据的访问负载,大多在不完整交易的这张表里面,对于完整交易,是不存在插入操作的,只会是查询操作。 |
5分 |
楼主可能没有明白我说的业务逻辑。
1. 先查询不完成交易表里,有没有当前用户的不完整交易,如果没有,进入2. 如果有进入4. 2. 查询历史记录(完整交易表)里,有没有当前用户的完整交易信息,如果没有,进入3. 如果有进入5. 3. 在不完整交易表里面插入记录,手机号码有唯一限定,如果插入失败,诱导用户进入1. 如果插入成功,则进入支付环节,如果支付失败诱导用户进入4. 4. 重复支付操作一次,如果超过重复支付的最大次数,则终止支付 5. 提示用户已经体验过该服务,不能多次使用。 |
我大致理解你的想法,结合我自己的逻辑业务,我已经能解决这个问题了。 |
|
5分 |
|
5分 |
分布式一致性锁
|
我知道UPDATE的时候可以用乐观锁,但是INSERT的时候应该无法用乐观锁吧?队列的话,2台机器,很难处理吧 |
|
5分 |
为啥会有一个手机号同时下单的情况,是担心重复提交么?
|
如果他打开2个浏览器同时操作,那是不是就会造成并发的情况。 |
|
5分 |
如果是单个用户,是不可能造成并发的 |
5分 |
|
单个用户也是有可能的,和几个用户无关 |
|
5分 |
想一个简单的,可不可以弄个时间字段,将时间字段和手机号做个联合唯一
|
这个应该不好做吧,因为唯一字段是ORACLE本身提供的,ORACLE并不能提供联合唯一吧。不知道您有什么好的方法? |
|
5分 |
这个也是可行的 ,但是不是时间字段,而是促销活动ID字段+手机号。oracle支持联合唯一 |
5分 |
通过队列或者MQ解决吧
|