我需要在Java中以编程方式在sql server中创建一个sql序列,我应该能够从序列中检索连续值到程序。首先,我可以这样做吗?如果是这样的话?
答案 0 :(得分:0)
这是可能的,因为所有SQL服务器都提供了一些功能并保证了ACID规则。即使使用非常简单的旧MySql引擎也无法支持它可以实现的交易。最简单和广泛支持的方法是:
CREATE TABLE SequenceValue (
sequenceIdentifier varchar(124) NOT NULL PRIMARY KEY,
sequenceValue INT NOT NULL;
);
您需要在该计划中做的只有:
Connection con = dataSource.getConnection();
try {
con.setAutoCommit(true);
PreparedStatement st = con.prepareStatement("SELECT sequenceValue SequenceValue WHERE sequenceIdentifier = ?");
st.setString(1, sequenceIdentifier);
SQLException retried = null;
for (;;) {
ResultSet rs = st.executeQuery();
if (!rs.next()) {
if (retried != null)
throw retried;
PreparedStatement ins = con.prepareStatement("INSERT INTO SequenceValue (sequenceIdentifier, sequenceValue) VALUES (?, ?)");
ins.setString(1, sequenceIdentifier);
ins.setLong(2, 0);
try {
ins.executeUpdate();
}
catch (SQLException ex) {
// store the exception and rethrow if next query retry fails
retried = ex;
}
}
else {
long value = rs.getLong(1);
PreparedStatement upd = con.prepareStatement("UPDATE SequenceValue SET sequenceValue = sequenceValue+1 WHERE sequenceIdentifier = ? AND sequenceValue = ?");
upd.setString(1, sequenceIdentifier);
upd.setLong(2, value+1);
if (upd.executeUpdate() == 1)
return value+1;
}
}
}
finally {
con.close();
}
简要说明:代码完全避免了交易。在开始时,它尝试根据标识符检索序列值。如果找不到它,它会尝试创建它并重试再次检索。如果在此期间创建了值,它不会失败。
如果找到该值,它会尝试使用行上的原子更新来增加它。如果成功,则返回递增的值,否则再次重试。