用于防止重复订单的Java同步选项(文件、数据库锁定?)



我有两个在网站上下单的用例。一个是使用信用卡从网络前端直接提交的,另一个是来自贝宝等处理器的外部支付通知。在这两种情况下,我都需要确保订单只下一次。

如果可能的话,我想对这两种场景使用相同的机制,以帮助代码重用。在第一个用例中,用户可以多次提交订单,并导致不同的用户尝试下订单。我可以使用ajax来阻止这种情况,但我需要一个服务器端解决方案来确定。在第二个用例中,通知消息可能会重复发送,所以我也需要对此进行保护。

我希望该解决方案能够在分布式环境中进行扩展,因此内存锁定是不可能的。我曾考虑将一个唯一的令牌保存到数据库中,以防止在那里多次提交,但我真的不想干扰现有的数据库事务。真正的解决方案似乎是在jvm之间的共享位置锁定一些外部的东西,比如文件。

所有订单都有一个唯一的长id,所以我可以使用它进行同步。做这件事最好的方法是什么?我可能会为每个id创建一个文件,或者用文件的一个区域做一些更花哨的事情。然而,我在文件锁定方面没有太多经验,所以如果有更好的选择,我很乐意听到。任何代码示例都会很有帮助。

如果您已经有了一个唯一的长id,那么没有什么比手动分配主键的简单数据库表更好的了。每个RDBMS(以及键值NoSQL数据库)都将有效地发现主键冲突。基本上是:

  1. 启动事务
  2. INSERT INTO orders VALUES (your_unique_id)
  3. 提交

根据数据库,2。或3。将抛出一个您可以轻松捕获的异常。

如果你真的想避开数据库(你能详细说明一下原因吗?),你可以:

  1. 使用文件锁定(讨厌且不可扩展),不要这样做。

  2. 在使用集群的内存锁定中(使用Terracotta就像使用神奇集群的普通boolean

  3. 正在排队请求并且只有一个使用者。

使用JMS和单线程消费者看起来很有前景,但您仍然必须发现重复项(但至少要避免并发下订单),而且速度可能非常慢。。。

相关内容

  • 没有找到相关文章

最新更新