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