c# - 根据另一个列值插入唯一序列号

标签 c# sql sql-server

我有这个 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        |
+----+------+----------+

例如,要为必须为 3 的类型“B”插入下一个序列,我使用:

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");

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

关于c# - 根据另一个列值插入唯一序列号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35694632/

相关文章:

c# - 需要有关 asp.net 中查询字符串的帮助

mysql - 使用 COUNT 和 HAVING BY 的 SELECT 查询

mysql - 将数据类型从 bigint 更改为 tinyint 形成具有外键引用的现有表

php - 将 2 个 SQL 查询合并为一个 - 显示总销售额和净销售额

C# SQL 连接字符串

c# - 如何正确地将字符串传递给ffmpeg?

c# - 具有个人帐户和 ASP.NET Core 托管的 Blazor WebAssembly 应用程序 - 资源所有者密码凭据授予 - 未获得角色声明

c# - 最快的类型比较?

php - 从一个表中动态获取行并从其他表中获取值,将其求和并插入到目标表中

sql-server - TSQL 从 "seed"日期开始每隔一个星期五确定一次