安全获取序号线程
Get sequence number thread safely
我有一个 ASP.NET 应用程序,在使用 entity framework 在 table 中创建记录时,我使用数据库序列中的序列号。我有一个存储过程,用于检索从 entity framework 调用的此序列中的下一个值,我想确保此检索是线程安全的。
我使用 this 答案尝试在以下 class:
public static class SequenceNumber
{
private static object Lock = new object();
public static long Next(Context db)
{
long next = 0;
lock (Lock)
{
next = db.GetNextComplaintNumber().Single().Value;
}
return next;
}
}
这会确保线程安全吗?
Next(...) 方法将是线程安全的,但 db.GetNextComplaintNumber() 不是(除非它已实现)。锁定确保任何调用 Next(...) 的线程都必须等待轮到 运行 锁定语句中的任何内容。但是,如果任何其他线程可以访问对象 db,那么它们可以有效地调用 db.GetNextComplaintNumber() 而无需调用 Next(...) 方法,因此它不会受到 lock 语句的保护。如果你能保证只在 Next(...) 方法中调用 db.GetNextComplaintNumber() 那么你应该是安全的,否则你会想在 db.GetNextComplaintNumber() 方法中实现线程安全。
我有一个 ASP.NET 应用程序,在使用 entity framework 在 table 中创建记录时,我使用数据库序列中的序列号。我有一个存储过程,用于检索从 entity framework 调用的此序列中的下一个值,我想确保此检索是线程安全的。
我使用 this 答案尝试在以下 class:
public static class SequenceNumber
{
private static object Lock = new object();
public static long Next(Context db)
{
long next = 0;
lock (Lock)
{
next = db.GetNextComplaintNumber().Single().Value;
}
return next;
}
}
这会确保线程安全吗?
Next(...) 方法将是线程安全的,但 db.GetNextComplaintNumber() 不是(除非它已实现)。锁定确保任何调用 Next(...) 的线程都必须等待轮到 运行 锁定语句中的任何内容。但是,如果任何其他线程可以访问对象 db,那么它们可以有效地调用 db.GetNextComplaintNumber() 而无需调用 Next(...) 方法,因此它不会受到 lock 语句的保护。如果你能保证只在 Next(...) 方法中调用 db.GetNextComplaintNumber() 那么你应该是安全的,否则你会想在 db.GetNextComplaintNumber() 方法中实现线程安全。