1
我有一個分佈式系統,我需要生成一個ID然後在多個記錄中使用該ID。記錄互相引用,所以我寧願不插入主機以生成ID,然後是子級如何在插入行之前在Sybase SQL中生成ID
我希望能做的是從Sybase中按順序生成一個唯一的ID,使用該ID創建所有關聯的記錄,然後在批量更新中執行所有插入。
我可以有一個IDENTITY字段的表,只需要在那裏插入記錄並獲取生成的ID。然而,用這種方法,我創造了大量無用的記錄。
我試過這種方法,但它拋出一個異常
@Transactional(isolation = Isolation.SERIALIZABLE)
public synchronized Long getNextId(){
Long id = -1;
String sql = "UPDATE MY_IDS SET MY_ID=MY_ID+1\n\n" +
"SELECT MY_ID FROM MY_IDS";
List<Long> list = jdbcTemplate.query(sql, new RowMapper<Long>() {
@Override
public Long mapRow(ResultSet resultSet, int i) throws SQLException
{
return resultSet.getLong(1);
}
});
if(!list.isEmpty()) {
id = list.get(0);
}
return id;
}
我也試過,但也得到了SQL異常:
KeyHolder holder = new GeneratedKeyHolder();
jdbcTemplate.update(new PreparedStatementCreator() {
String sql = "UPDATE MY_IDS SET MY_ID=MY_ID+1" +
"SELECT MY_ID FROM MY_IDS";
@Override
public PreparedStatement createPreparedStatement(Connection connection)
throws SQLException {
PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
return ps;
}
}, holder);
Long id = holder.getKey().longValue();
有沒有更簡單的方式
這裏的一些解釋會有所幫助。目前尚不清楚這是否應該是答案,新問題或評論。 –
OP想要一種方法來生成一個唯一的ID。我暗示內置的「newid()」在這裏可能有些用處。所以,如果感興趣,原始海報可以簡單地在Sybase文檔中查找這個內置文件,然後從這裏繼續:) –
我建議將這個解釋添加到您的答案中。僅有代碼的答案並不總是很清楚。 :) –