在Java中以编程方式创建sql序列

在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,

我需要从Java以编程方式在SQLServer中创建一个sql序列,并且应该能够从序列到程序检索连续值。首先,我可以这样做吗?如果是这样的话,怎么办?

这是可能的,因为所有SQL Server都提供了一些功能并保证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();
}
简而言之:代码完全避免了事务。在开始时,它尝试根据标识符检索序列值。如果找不到它,它会尝试创建它并重试检索。如果同时创建了值,则不会失败

如果找到该值,它将尝试使用行上的原子更新来递增该值。如果成功,则返回递增的值,否则重试