安全获取序号线程

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() 方法中实现线程安全。