在Java中以编程方式创建sql序列
我需要从Java以编程方式在SQLServer中创建一个sql序列,并且应该能够从序列到程序检索连续值。首先,我可以这样做吗?如果是这样的话,怎么办?这是可能的,因为所有SQL Server都提供了一些功能并保证ACID规则。即使使用不支持事务的非常简单的MySql引擎,它也是可以实现的。最简单且得到广泛支持的方法是:在Java中以编程方式创建sql序列,java,sql,jdbc,Java,Sql,Jdbc,我需要从Java以编程方式在SQLServer中创建一个sql序列,并且应该能够从序列到程序检索连续值。首先,我可以这样做吗?如果是这样的话,怎么办?这是可能的,因为所有SQL Server都提供了一些功能并保证ACID规则。即使使用不支持事务的非常简单的MySql引擎,它也是可以实现的。最简单且得到广泛支持的方法是: CREATE TABLE SequenceValue ( sequenceIdentifier varchar(124) NOT NULL PRIMARY KEY,
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();
}
简而言之:代码完全避免了事务。在开始时,它尝试根据标识符检索序列值。如果找不到它,它会尝试创建它并重试检索。如果同时创建了值,则不会失败
如果找到该值,它将尝试使用行上的原子更新来递增该值。如果成功,则返回递增的值,否则重试