我遇到了重复记录通过 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/