java - 重复是因为 Oracle 太快还是多线程?

标签 java performance web-services oracle11g duplicates

我遇到了重复记录通过 Java Web 服务到达数据库的问题,我认为这与 Oracle 处理线程有关。

使用我们构建的 iPhone 应用程序,用户可以将鸟类观察结果添加到他们度假时访问的新网站上。他们在“新站点 A”(例如)创建了三个记录。 iPhone 将这三个记录分别打包为包含相同日期和位置详细信息的单独 JSON 字符串。

上传时,Web 服务会迭代每个 JSON 字符串。
迭代/观察 1. 它检查数据库以查看站点是否存在,如果不存在,则创建一个新站点并将观察添加到挂表中。
迭代/观察 2. 该站点现在应该存在于数据库中,但在迭代 1 中的数据库站点检查中未找到该站点,因此创建了第二个新站点。
迭代/观测 3. 对现有站点的检查现在可以进行,并且第三个观测值附加到现有站点之一。因此 Web 服务和数据库代码确实可以工作。

Web 服务在每次迭代结束时提交。

第二次迭代在数据库中找不到新站点的原因是由于 Java 调用 Oracle 提交后的延迟,因此在迭代 1 真正完成时它已经开始处理迭代 2,或者Oracle 有可能在单独的线程上运行每个迭代吗?

我们考虑的一个解决方案是在 Web 服务中使用 Thread.sleep(1000),但我不想惩罚 iPhone 用户。

感谢您提供的任何帮助。 伊恩

最佳答案

对我来说听起来像是一个竞争条件。可能您的观察值 1 和 2 到达的位置非常接近,因此当 2 到达时 1 仍在处理。 Oracle 符合 ACID,这意味着观察 2 的事务无法看到事务 1 中所做的更改,除非该事务是在事务 2 开始之前完成的。

如果您需要先检查然后创建的功能,您最好在后端的单个点同步此功能。

此外,请在数据库中添加约束,以不惜一切代价避免重复。

关于java - 重复是因为 Oracle 太快还是多线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15786180/

相关文章:

java - 在 JavaFx 中为 GridPane 设置标签

java - 通过自定义注释属性查找原型(prototype)bean

java - 如何选择合适的 Java 数据结构来模拟 1-n 关系映射?

arrays - Clojure中Heap的算法(能否高效实现?)

python - 用于读取行的最佳 HDF5 数据集 block 形状

web-services - Kafka-Web服务实时流

java - 如何使用ios应用程序不同元素的属性创建xpath

javascript - 使用 Javascript 进行快速排序的大 O 问题

android - 将 JSON 数据发布到 Android 中的网络服务器时出现 406 错误?

java - JBoss 6 在启动时创建 Web 服务实例