У меня есть таблица 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>
, я нахожу запись.
Теоретически это не должнобывает. Это происходит только в базе данных с несколькими экземплярами с несколькими адресами с балансировкой нагрузки. Это не происходит в обычной базе данных одного экземпляра.
Кстати, никто, кроме меня, не использует эту таблицу.
Администратор базы данных просто говорит, что "все в порядке" на их стороне,
Кто-нибудь знает подобную проблему и как это исправить?