以下是我现在面临的一个问题的描述
我想给用户一些促销,是基于他是否做了一项交易,其中他得到了促销discount
问题是,如果两个请求同时出现并读取一个事务尚未完成,并且在这两个请求上都应用了事务提升。
找到解决方案,https://dzone.com/articles/synchronized-by-the-value-of-the-object-in-java,但对分布式环境无效。
什么可以是不同的方法来解决这样的程序。只是对这个问题非常好奇>
发布于 2020-07-10 02:27:51
分布式环境需要分布式锁。这里有很多选择,我们使用了zookeeper,我的其他团队使用了redis。我也知道(理论上) hazelcast也有这样的原则;我打赌还有更多的原则。
在分布式环境中,有些事情需要考虑,有些事情稍微复杂一些。如果“提供”锁定机制的服务死了,如果获得一个锁的客户端从未释放它(它可能永远在内部死掉或阻止),等等。第一个锁有容错策略,第二个机制(释放超时或锁的“自动断开”)。
不久前,我在一家针对MSSQL数据库的“手工”公司工作。他们所做的(我只是该服务的使用者),是创建一个java代理来检测字节代码,并且在某些执行点连接到数据库并尝试"CAS“(比较和交换)表中的某一行。我现在不知道那个项目的信念,但我至今仍然喜欢这个想法。
底线是有很多选择,真的。这在很大程度上取决于您所参与的基础设施和团队。
发布于 2020-07-07 15:23:38
有不同的方法可以实现这一点。使用可序列化事务隔离级别访问表是一种方法。但是,由于您提到了这个过程也涉及到可能长时间运行的外部调用,所以您可以执行如下两阶段的方法:
启动transaction
。
https://stackoverflow.com/questions/62702292
复制相似问题