我有一个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();
}
答案 0 :(得分:0)
列的自动增量值在db级别上进行管理。因此,您可以在多线程环境中无需担心地获取值以获取密钥。
只要调用更新SQL语句,就会启动事务。它发生在db级别。它会保持打开状态,直到您手动提交或启用自动提交为止。