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

标签 java multithreading jdbc

我在网上搜索了一些简单的例子,但没有成功。我需要使用 JDBC 针对 Oracle 数据库将 selectinsert 操作作为 Java 中的原子单元运行。

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

  1. 选择用户的代码
  2. 检查所有代码,直到找到未使用的代码(由于用户可以删除,因此范围中间可能有可用的代码)
  3. 使用可用代码插入新用户

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

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

最佳答案

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

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

希望这有帮助。

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

相关文章:

java - Hibernate 中的 AnnotationConfiguration 和 Configuration 有什么区别?

java - 多线程环境java中的整数赋值

java.sql.SQLException : Closed Resultset: next

java - 错误: java. lang.NoClassDefFoundError : com. fastxml.jackson.databind.Module

java - 如何最小化UDP丢包

java - "deWiTTERS Game Loop"是否假设不间断电源?

c# - Json.Net 中的 "Current error context error is different to requested error"异常

java - 用于矩阵乘法的线程程序

java - MySQLNonTransientConnectionException 无法创建与数据库服务器的连接。由 : java. lang.NullPointerException 引起

database - 关于Java中的Prepared Statement的问题