我有一个web应用程序,它使用一个表的自动增量值插入到其他表中。我需要确保为auto increment列读取的值在表中存在潜在的并发插入时是正确的。既然每个线程都有自己的连接(来自容器池),我还需要将代码放在事务中吗?
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条答案
按热度按时间vfwfrxfs1#
列的autoincrement值在db级别上管理。因此,在多线程环境中,您可以不必担心地获取值来获取密钥。
一旦调用updatesql语句,事务就开始了。它发生在db级别。它将保持打开状态,直到您手动提交或启用自动提交。