插入基于另一个列值的唯一序列号

本文关键字:唯一 序列号 另一个 插入 | 更新日期: 2023-09-27 18:36:50

我有这个SQL Server 2008 R2表(t1):

+----+------+----------+
| id | type | sequence |
+----+------+----------+
| 1  | 'A'  | 1        |
| 2  | 'A'  | 2        |
| 3  | 'A'  | 3        |
| 4  | 'B'  | 1        |
| 5  | 'B'  | 2        |
| 6  | 'C'  | 1        |
+----+------+----------+

例如,要插入类型"B"的下一个序列,该序列必须是 3,我使用:

void Add(string type)
{
     int i = db.ExecuteScalar("select coalesce(max(sequence) + 1, 1) from t1 where type='" + type + "'"); 
     db.ExecuteNonQuery("insert into t1 (type, sequence) values ('" + type + "', " + i + ")");
}
Add("B");

这工作正常,但如果两个用户同时执行 Add("B"),他们将获得并插入相同的序列

我应该如何防止这种情况发生?

插入基于另一个列值的唯一序列号

您可以添加锁定语句。为了防止死锁,您应该在任务中执行查询。

private static object ExecuteLock = new object();
void Add(string type)
{
    Task.Run(() =>
    {
        lock(ExecuteLock)
        {
            int i = db.ExecuteScalar("select coalesce(max(sequence) + 1, 1) from t1 where type='" + type + "'"); 
            db.ExecuteNonQuery("insert into t1 (type, sequence) values ('" + type + "', " + i + ")");
        }
    });
}
Add("B");

仅当两个用户使用相同的应用程序和应用程序的同一实例插入唯一的序列号时,此操作才有效。如果两个用户使用不同的应用程序,则需要在数据库级别解决此问题,如注释中所述