在另一个应用程序中,我被糟糕的设计所震惊:多个线程EnsureDatabaseSchemaExists()
同时执行一个方法,基本上看起来像这样:
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'MyTable') AND type = N'U') BEGIN
CREATE TABLE MyTable ( ... );
END
但是,即使在SERIALIZABLE事务中执行,此代码似乎也不是线程安全的(即,并行代码尝试多次创建表)。有没有机会强迫SELECT语句获取一个锁定,从而防止另一个线程执行相同的SELECT语句?
多线程EnsureSchemaExists()方法是否有更好的模式?