首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java中Rest服务中解决分布式环境中种族问题的不同方法

java中Rest服务中解决分布式环境中种族问题的不同方法
EN

Stack Overflow用户
提问于 2020-07-02 17:49:57
回答 2查看 707关注 0票数 3

以下是我现在面临的一个问题的描述

我想给用户一些促销,是基于他是否做了一项交易,其中他得到了促销discount

  • Promotional折扣,在交易

  • 上有一定的折扣,因此条件是,在处理事务之前,将检查他是否使用促销完成了一项事务,并将根据该金额计算。

问题是,如果两个请求同时出现并读取一个事务尚未完成,并且在这两个请求上都应用了事务提升。

找到解决方案,https://dzone.com/articles/synchronized-by-the-value-of-the-object-in-java,但对分布式环境无效。

什么可以是不同的方法来解决这样的程序。只是对这个问题非常好奇>

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-10 02:27:51

分布式环境需要分布式锁。这里有很多选择,我们使用了zookeeper,我的其他团队使用了redis。我也知道(理论上) hazelcast也有这样的原则;我打赌还有更多的原则。

在分布式环境中,有些事情需要考虑,有些事情稍微复杂一些。如果“提供”锁定机制的服务死了,如果获得一个锁的客户端从未释放它(它可能永远在内部死掉或阻止),等等。第一个锁有容错策略,第二个机制(释放超时或锁的“自动断开”)。

不久前,我在一家针对MSSQL数据库的“手工”公司工作。他们所做的(我只是该服务的使用者),是创建一个java代理来检测字节代码,并且在某些执行点连接到数据库并尝试"CAS“(比较和交换)表中的某一行。我现在不知道那个项目的信念,但我至今仍然喜欢这个想法。

底线是有很多选择,真的。这在很大程度上取决于您所参与的基础设施和团队。

票数 2
EN

Stack Overflow用户

发布于 2020-07-07 15:23:38

有不同的方法可以实现这一点。使用可序列化事务隔离级别访问表是一种方法。但是,由于您提到了这个过程也涉及到可能长时间运行的外部调用,所以您可以执行如下两阶段的方法:

启动transaction

  • Use "select for update“以搜索和锁定用户有权使用promotion.

  • Check的记录(如果已经使用了升级)。如果是,则提交事务处理,则不可进行升级。如果没有,则提交事务。升级可用。

  • 执行外部调用

  • 启动事务并再次执行促销检查,并使用"select for update",但这一次,插入使用促销的记录以及

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62702292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档