在多线程环境中使用JDBC getGeneratedKeys函数

时间:2018-01-02 16:14:54

标签: java mysql multithreading jdbc auto-increment

我有一个Web应用程序,它使用一个表的AUTO INCREMENT值插入到其他表中。我需要确保在存在可能的并发INSERT到该表时,为自动增量列读取的值是正确的。由于每个线程都有自己的连接(来自容器池),我还需要将代码放在事务中吗?

PreparedStatement ps = null;
ResultSet rs = null;
String sql = "INSERT INTO KYC_RECORD ....";
int autoIncKeyFromApi = -1;

Connection connection = ....

try {

    connection.setAutoCommit(false);

    ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

    ps.setString( ... );

    ps.executeUpdate();

    rs = ps.getGeneratedKeys();

    if (rs.next()) {
        autoIncKeyFromApi = rs.getInt(1);
    } else {

        // throw an exception from here
    }

    connection.commit();
}

1 个答案:

答案 0 :(得分:0)

列的自动增量值在db级别上进行管理。因此,您可以在多线程环境中无需担心地获取值以获取密钥。

只要调用更新SQL语句,就会启动事务。它发生在db级别。它会保持打开状态,直到您手动提交或启用自动提交为止。