【问题标题】:Validation and DB Update : Java Servlet验证和数据库更新:Java Servlet
【发布时间】:2014-03-13 18:34:04
【问题描述】:

让我先提供我的应用程序的执行流程。

在应用程序中,订阅者可以通过提供他们的信息和信用卡号来注册。根据提供的信息,应用程序返回成功/失败响应。

在应用程序中有一个检查,一个 CC 号码只能使用固定次数。应用程序检查是否超出该计数。如果是则返回失败响应。

从技术上讲,它是使用 J2EE 架构(servlet 和 JSP)设计的。现在,对 CC 使用计数的检查被放置在插入逻辑之上。因此,如果 CC 限制配置为 1 个和 2 个具有相同 CC 编号的注册请求,则两个订阅者都会注册,而理想情况下应该只有一个。

谁能帮我解决这个问题?一种可能的解决方案是将两个(检查和插入)操作结合在一起并将它们包装在静态同步块中。但是,在这种特定情况下,这似乎并不合适,因为它会扰乱整个流程。还有其他想法吗?

【问题讨论】:

    标签: java multithreading validation servlets


    【解决方案1】:

    当您读取存储卡的使用次数时(我假设这是您桌子上的一列)

    当您进行更新时,将更新限制为仅在表中的列与您之前存储的值相同时才进行更新。

    如果您更新 1 行,那么您就赢了。

    如果您的更新没有更新 1 行,则该卡已被多次使用。

    【讨论】:

    • 是的。这确实是桌面上的一列。考虑以下步骤: 当前计数为 0,最大计数为 1 1. Thread-1 进入,读取计数 (0) 并将其存储在某处。 2. Thread-2 进来,读取计数,因为 Thread-1 还没有完成,所以仍然是 0。 3. Thread-1 完成插入,发现值和之前存储的值相同 (0),因此将其更新为 1。 4. Thread-2 完成插入,发现值不同,因此不存储。但是,在这种情况下,两个线程都会通过,这不应该发生。
    • 不完全- 在第二种情况下- 当它不存储时- 您认识到插入没有工作并将其作为错误报告给用户。这并不能真正完全解决您的问题,因为如果最大计数为 2,您可能希望两个线程都工作......也许将更新语句更改为仅在表上的列小于最大计数时进行更新.我认为这更适合您 - 您甚至不需要进行第一次阅读(除非您的代码的其他部分依赖于该数据)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    相关资源
    最近更新 更多