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 ()?
Ma recommandation serait de faire de son mieux pour essayer / attraper. Traitez le cas en double de manière explicite, le cas échéant, par exemple. ignorez-le ...
La vraie question: pourquoi DDL fonctionne-t-il à la demande, à partir de plusieurs xacts? Normalement, la mise à niveau et la migration sont un problème sérieux, géré dans des fenêtres de temps dédiées ... Vous ne voulez pas que votre migration (code en premier?) Se déclenche de manière inattendue, certaines de ces étapes de mise à jour peuvent prendre des heures sur une grande table (taille de -opérations de données ...)
la source
CREATE TABLE
subvention pour des opérations normales ...