gpt4 book ai didi

java - JBDC - 跨并发线程以原子方式执行 SELECT 和 INSERT

转载 作者:行者123 更新时间:2023-12-03 12:56:44 25 4
gpt4 key购买 nike

我在网上搜索了简单的例子,但无济于事。我需要运行一个 selectinsert操作作为 Java 中的原子单元,对 Oracle 数据库使用 JDBC。

实际上,我需要执行以下操作:

  • 从用户中选择代码
  • 遍历所有代码,直到找到一个未使用的代码(因为可以删除用户,因此范围中间可能有可用代码)
  • 使用该可用代码插入新用户

  • 这通常是一个简单的操作,但由于我的应用程序是多线程的,我不确定如何进行。由于同时运行的并发线程可以使用相同的代码值尝试和插入。

    我可以想到一些解决方法或技巧来完成这项工作,但总的来说,我如何锁定表以使此操作原子化?我所看到的大部分内容都涉及行锁,但由于我没有更新,所以我看不出这是如何适用的。

    最佳答案

    这是一个很难完全用 SQL 完成的问题。任何解决方案都会有竞争条件问题。如果我打算完全在 SQL 中完成它,我会使用已删除的代码表。当用户被删除时,您将使用某些服务将他们的代码添加到已删除的表中。如果删除的代码表为空,线程将使用序列号来获取它们的新代码。从删除中获取代码需要在 synchronized 中由于 get 和 then set 性质与多个 SQL 操作的阻塞。我不认为 SQL 事务会在那里有所帮助。他们可能会保持数据一致,但如果两个线程使用相同的代码,那么两个提交之一将抛出异常。

    我认为更好、更快的机制是让一个单独的线程管理这些已删除的代码。它可以将其写入数据库,但也可以保留 BlockingQueue其他线程使用的已删除代码。如果必须没有漏洞并且您担心崩溃,则需要通过在启动时查询用户表来验证可用漏洞列表。它不需要同步或执行任何 SQL 事务,因为它只会从已删除的代码表中删除。

    希望这可以帮助。

    关于java - JBDC - 跨并发线程以原子方式执行 SELECT 和 INSERT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9579707/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com