En otra aplicación, me llamó la atención el mal diseño: varios subprocesos ejecutan un EnsureDatabaseSchemaExists()
método simultáneamente, que se ve básicamente así:
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'MyTable') AND type = N'U') BEGIN
CREATE TABLE MyTable ( ... );
END
Sin embargo, incluso si se ejecuta en una transacción SERIALIZABLE, este código no parece ser seguro para subprocesos (es decir, el código paralelo intenta crear la tabla varias veces). ¿Hay alguna posibilidad de forzar a la instrucción SELECT a adquirir un bloqueo que evite que otro subproceso haga la misma instrucción SELECT?
¿Existe un mejor patrón para los métodos multi-thread-GuaranteeSchemaExists ()?