首页 > 解决方案 > 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 只是说“一切都是正确的”。

有谁知道类似的问题以及如何解决这个问题?

标签: javasqloraclejdbc

解决方案


推荐阅读