我有一个ASP.NET应用程序,在使用实体框架在表中创建记录时,我使用数据库序列中的序列号。我有一个存储过程,它检索从实体框架调用的此序列中的下一个值,我想确保此检索是线程安全的。
我使用this回答在以下类中尝试此操作:
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;
}
}
这会确保线程安全吗?
答案 0 :(得分:1)
Next(...)方法将是线程安全的,但db.GetNextComplaintNumber()将不会(除非它被实现)。锁确保任何调用Next(...)的线程都必须等待它们运行lock语句中的任何内容。但是,如果任何其他线程有权访问对象db,那么他们可以有效地调用db.GetNextComplaintNumber()而无需调用Next(...)方法,因此它不会受到lock语句的保护。如果你能保证db.GetNextComplaintNumber()只在Next(...)方法中调用,那么你应该是安全的,否则你会想要在db.GetNextComplaintNumber()方法中实现线程安全。