Dans une autre application, j'ai été frappé par une mauvaise conception: plusieurs threads exécutent une EnsureDatabaseSchemaExists()
méthode simultanément, qui ressemble essentiellement à ceci:
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'MyTable') AND type = N'U') BEGIN
CREATE TABLE MyTable ( ... );
END
Cependant, même s'il est exécuté dans une transaction SERIALIZABLE, ce code ne semble pas être thread-safe (c'est-à-dire que le code parallèle essaie de créer la table plusieurs fois). Est-il possible de forcer l'instruction SELECT à acquérir un verrou qui empêche un autre thread de faire la même instruction SELECT?
Existe-t-il un meilleur modèle pour les méthodes multi-thread-EnsureSchemaExists ()?