Oracle просто вставил данные не найдены - PullRequest
0 голосов
/ 11 октября 2019

У меня есть таблица 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>, я нахожу запись.

Теоретически это не должнобывает. Это происходит только в базе данных с несколькими экземплярами с несколькими адресами с балансировкой нагрузки. Это не происходит в обычной базе данных одного экземпляра.

Кстати, никто, кроме меня, не использует эту таблицу.

Администратор базы данных просто говорит, что "все в порядке" на их стороне,

Кто-нибудь знает подобную проблему и как это исправить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...