java - oracle刚插入数据没找到
问题描述
我有一张桌子t
:
table t (c number);
我正在尝试从此表中选择一个值,如果找不到该值,请插入它然后再次选择它。但有时即使在插入记录之后,我也找不到该行。
这是代码的简化玩具版本(忽略可注入的 SQL):
for (int x = 0; x < 4; x++) {
int n = x * 10000;
new Thread(() -> {
try (Connection c = Connections.get();
Connection c2 = Connections.get()) {
for (int i = n; i < n + 10000; i++) {
int retries = 0;
while (true) {
String sql = "select * from t where c = " + i;
try (PreparedStatement ps = c.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
if (rs.next()) {
System.out.println("found " + i);
break;
} else {
retries++;
if (retries > 1) {
System.out.println("It happened. Not found " + i + " (retries: " + retries + ")");
System.exit(1);
}
System.out.println("Not found " + i + " (retries: " + retries + ")");
sql = "insert into t values (" + i + ")";
try (PreparedStatement ps2 = c2.prepareStatement(sql)) {
ps2.executeUpdate();
}
}
}
}
}
} catch (Exception e) {
System.err.println(e.getMessage());
}
}).start();
}
它偶尔会打印以下内容并停止。有时很快,有时几分钟后。
It happened. Not found <whatever> (retries: 2)
在这个错误之后,如果我尝试运行select * from t where c = <whatever>
,我会找到记录。
理论上,这不应该发生。它仅发生在具有多个负载平衡地址的多实例数据库中。它不会发生在常规的单实例数据库中。
顺便说一句,除了我,没有其他人在使用这张桌子。
DBA 只是说“一切都是正确的”。
有谁知道类似的问题以及如何解决这个问题?
解决方案
推荐阅读
- model-view-controller - 返回 JSON 格式的控制器不返回目标页面
- amazon-web-services - AWS Glue 在连续运行时输出空文件
- tinymce - 更改编辑器皮肤和 content_css
- java - 使用 Java 中的 AliExpress 淘宝客户端 API 获取订单数据
- git - git filter-branch:无法重写分支:您有未暂存的更改
- javascript - jquery(ajax)中的JS变量附加html标签
- unity3d - Unity 错误 CS1520:方法必须有返回类型
- firebase - 每个项目的 Firebase 应用限制 - 达到 1000
- html - JQuery 性能问题
- r - 在 data.table 列的子集上使用 `any()`